diff --git a/src/lua/utils.c b/src/lua/utils.c
index b40abf54f52960b92d6314849e0c2cdf6adc8385..b78b5d6e43ce0459538532f7ed56ca13be847a8d 100644
--- a/src/lua/utils.c
+++ b/src/lua/utils.c
@@ -499,10 +499,10 @@ luaL_tofield(struct lua_State *L, struct luaL_serializer *cfg, int index,
 		if (isfinite(num) && modf(num, &intpart) != 0.0) {
 			field->type = MP_DOUBLE;
 			field->dval = num;
-		} else if (num >= 0 && num <= UINT64_MAX) {
+		} else if (num >= 0 && num < exp2(64)) {
 			field->type = MP_UINT;
 			field->ival = (uint64_t) num;
-		} else if (num >= INT64_MIN && num <= INT64_MAX) {
+		} else if (num > -exp2(63) && num < exp2(63)) {
 			field->type = MP_INT;
 			field->ival = (int64_t) num;
 		} else {
diff --git a/test/box/indices_any_type.result b/test/box/indices_any_type.result
index 051cb605181fbd0109648ddf5828685d059b6852..dce9f754c1fe0082b386ad24b4a2a0ef7b631f54 100644
--- a/test/box/indices_any_type.result
+++ b/test/box/indices_any_type.result
@@ -393,12 +393,12 @@ s5:insert({0xFFFFFFFFFFFFFFFFULL})
 ...
 s5:insert({ffi.new('double', ffi.C.exp2(64))}) -- success
 ---
-- [0]
+- [1.844674407371e+19]
 ...
 s5:select()
 ---
 - - [18446744073709551615]
-  - [0]
+  - [1.844674407371e+19]
 ...
 s5:truncate()
 ---