diff --git a/src/json.hpp b/src/json.hpp
index 630624a6..9fd0d05b 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -498,22 +498,23 @@ template <typename Json, typename ArithmeticType,
                       int> = 0>
 void get_arithmetic_value(const  Json& j, ArithmeticType& val)
 {
-    // unsigned must be checked first, since is_number_integer() == true for unsigned
-    if (j.is_number_unsigned())
+    switch (static_cast<value_t>(j))
     {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_unsigned_t*>());
-    }
-    else if (j.is_number_integer())
-    {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_integer_t*>());
-    }
-    else if (j.is_number_float())
-    {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_float_t*>());
-    }
-    else
-    {
-        JSON_THROW(std::domain_error("type must be number, but is " + type_name(j)));
+        case value_t::number_unsigned:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_unsigned_t*>());
+            break;
+        case value_t::number_integer:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_integer_t*>());
+            break;
+        case value_t::number_float:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_float_t*>());
+            break;
+        default:
+            JSON_THROW(
+                std::domain_error("type must be number, but is " + type_name(j)));
     }
 }
 
@@ -752,32 +753,37 @@ template <
     typename Json, typename ArithmeticType,
     enable_if_t <
         std::is_arithmetic<ArithmeticType>::value and
-        not std::is_same<ArithmeticType, typename Json::number_unsigned_t>::value and
-        not std::is_same<ArithmeticType, typename Json::number_integer_t>::value and
-        not std::is_same<ArithmeticType, typename Json::number_float_t>::value and
+        not std::is_same<ArithmeticType,
+                         typename Json::number_unsigned_t>::value and
+        not std::is_same<ArithmeticType,
+                         typename Json::number_integer_t>::value and
+        not std::is_same<ArithmeticType,
+                         typename Json::number_float_t>::value and
         not std::is_same<ArithmeticType, typename Json::boolean_t>::value,
         int > = 0 >
-void from_json(const  Json& j, ArithmeticType& val)
+void from_json(const Json& j, ArithmeticType& val)
 {
-    if (j.is_number_unsigned())
+    switch (static_cast<value_t>(j))
     {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_unsigned_t*>());
-    }
-    else if (j.is_number_integer())
-    {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_integer_t*>());
-    }
-    else if (j.is_number_float())
-    {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_float_t*>());
-    }
-    else if (j.is_boolean())
-    {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::boolean_t*>());
-    }
-    else
-    {
-        JSON_THROW(std::domain_error("type must be number, but is " + type_name(j)));
+        case value_t::number_unsigned:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_unsigned_t*>());
+            break;
+        case value_t::number_integer:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_integer_t*>());
+            break;
+        case value_t::number_float:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_float_t*>());
+            break;
+        case value_t::boolean:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::boolean_t*>());
+            break;
+        default:
+            JSON_THROW(
+                std::domain_error("type must be number, but is " + type_name(j)));
     }
 }
 
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index 710f61e8..c400e156 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -498,22 +498,23 @@ template <typename Json, typename ArithmeticType,
                       int> = 0>
 void get_arithmetic_value(const  Json& j, ArithmeticType& val)
 {
-    // unsigned must be checked first, since is_number_integer() == true for unsigned
-    if (j.is_number_unsigned())
+    switch (static_cast<value_t>(j))
     {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_unsigned_t*>());
-    }
-    else if (j.is_number_integer())
-    {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_integer_t*>());
-    }
-    else if (j.is_number_float())
-    {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_float_t*>());
-    }
-    else
-    {
-        JSON_THROW(std::domain_error("type must be number, but is " + type_name(j)));
+        case value_t::number_unsigned:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_unsigned_t*>());
+            break;
+        case value_t::number_integer:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_integer_t*>());
+            break;
+        case value_t::number_float:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_float_t*>());
+            break;
+        default:
+            JSON_THROW(
+                std::domain_error("type must be number, but is " + type_name(j)));
     }
 }
 
@@ -752,32 +753,37 @@ template <
     typename Json, typename ArithmeticType,
     enable_if_t <
         std::is_arithmetic<ArithmeticType>::value and
-        not std::is_same<ArithmeticType, typename Json::number_unsigned_t>::value and
-        not std::is_same<ArithmeticType, typename Json::number_integer_t>::value and
-        not std::is_same<ArithmeticType, typename Json::number_float_t>::value and
+        not std::is_same<ArithmeticType,
+                         typename Json::number_unsigned_t>::value and
+        not std::is_same<ArithmeticType,
+                         typename Json::number_integer_t>::value and
+        not std::is_same<ArithmeticType,
+                         typename Json::number_float_t>::value and
         not std::is_same<ArithmeticType, typename Json::boolean_t>::value,
         int > = 0 >
-void from_json(const  Json& j, ArithmeticType& val)
+void from_json(const Json& j, ArithmeticType& val)
 {
-    if (j.is_number_unsigned())
+    switch (static_cast<value_t>(j))
     {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_unsigned_t*>());
-    }
-    else if (j.is_number_integer())
-    {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_integer_t*>());
-    }
-    else if (j.is_number_float())
-    {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::number_float_t*>());
-    }
-    else if (j.is_boolean())
-    {
-        val = static_cast<ArithmeticType>(*j.template get_ptr<const typename Json::boolean_t*>());
-    }
-    else
-    {
-        JSON_THROW(std::domain_error("type must be number, but is " + type_name(j)));
+        case value_t::number_unsigned:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_unsigned_t*>());
+            break;
+        case value_t::number_integer:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_integer_t*>());
+            break;
+        case value_t::number_float:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::number_float_t*>());
+            break;
+        case value_t::boolean:
+            val = static_cast<ArithmeticType>(
+                      *j.template get_ptr<const typename Json::boolean_t*>());
+            break;
+        default:
+            JSON_THROW(
+                std::domain_error("type must be number, but is " + type_name(j)));
     }
 }