diff --git a/core/tarantool_lua.m b/core/tarantool_lua.m
index 71f33d60dd6996740f6a0b2d1a0232c0dfb20c72..32790e1001adf2500cc3e87e4326c929e8e8572f 100644
--- a/core/tarantool_lua.m
+++ b/core/tarantool_lua.m
@@ -101,11 +101,9 @@ lua_tointeger64(struct lua_State *L, int idx)
 	case LUA_TSTRING: {
 		const char *arg = luaL_checkstring(L, idx);
 		char *arge;
-		result = strtoll(arg, &arge, 10);
-		if ((errno == ERANGE && (result == LONG_MAX || result == LONG_MIN)) ||
-		    (errno != 0 && result == 0))
-			luaL_error(L, "lua_tointeger64: ", strerror(errno));
-		if (arge == arg)
+		errno = 0;
+		result = strtoull(arg, &arge, 10);
+		if (errno != 0 || arge == arg)
 			luaL_error(L, "lua_tointeger64: bad argument");
 		break;
 	}
@@ -249,12 +247,12 @@ lbox_pack(struct lua_State *L)
 static GCcdata*
 luaL_pushcdata(struct lua_State *L, CTypeID id, int bits)
 {
-	TValue *o = L->base + 1;
 	CTState *cts = ctype_cts(L);
 	CType *ct = ctype_raw(cts, id);
 	CTSize sz;
 	lj_ctype_info(cts, id, &sz);
 	GCcdata *cd = lj_cdata_new(cts, id, bits);
+	TValue *o = L->base + 1;
 	setcdataV(L, o - 1, cd);
 	lj_cconv_ct_init(cts, ct, sz, cdataptr(cd), o, 0);
 	L->top = o;
diff --git a/test/box/lua.result b/test/box/lua.result
index 90c5843b8819db6f2acbb5d519b23fde5f8065c6..706ad188af552a0cd12c116f55829be70830bdcb 100644
--- a/test/box/lua.result
+++ b/test/box/lua.result
@@ -920,6 +920,22 @@ lua tonumber64('9223372036854775807') - tonumber64('9223372036854775800')
 ---
  - 7
 ...
+lua tonumber64('18446744073709551615') == tonumber64('18446744073709551615')
+---
+ - true
+...
+lua tonumber64('18446744073709551615') + 1
+---
+ - 0
+...
+lua tonumber64(-1)
+---
+ - 18446744073709551615
+...
+lua tonumber64('184467440737095516155')
+---
+error: 'Lua error: lua_tointeger64: bad argument'
+...
 lua string.byte(box.pack('p', tonumber64(123)))
 ---
  - 8
diff --git a/test/box/lua.test b/test/box/lua.test
index 1595b6c029cb2a1c9e3090698bb6331bb4edd0b5..408aca26263aea2ffc839dfd3628d88b76a7bd80 100644
--- a/test/box/lua.test
+++ b/test/box/lua.test
@@ -282,4 +282,8 @@ exec admin "lua tonumber64('123')"
 exec admin "lua type(tonumber64('123')) == 'cdata'"
 exec admin "lua tonumber64('9223372036854775807') == tonumber64('9223372036854775807')"
 exec admin "lua tonumber64('9223372036854775807') - tonumber64('9223372036854775800')"
+exec admin "lua tonumber64('18446744073709551615') == tonumber64('18446744073709551615')"
+exec admin "lua tonumber64('18446744073709551615') + 1"
+exec admin "lua tonumber64(-1)"
+exec admin "lua tonumber64('184467440737095516155')"
 exec admin "lua string.byte(box.pack('p', tonumber64(123)))"
diff --git a/test/box_big/lua.result b/test/box_big/lua.result
index 9e77209833fd97f5105c1744438290281af527a9..9b60d8228a1bc77d5bfeeea6eec79c9487253c8f 100644
--- a/test/box_big/lua.result
+++ b/test/box_big/lua.result
@@ -73,3 +73,25 @@ Found 2 tuples:
 lua box.space[5]:truncate()
 ---
 ...
+lua box.insert('8', tonumber64('18446744073709551615'), 'magic')
+---
+ - 18446744073709551615: {'magic'}
+...
+lua tu = box.select('8', '0', tonumber64('18446744073709551615'))
+---
+...
+lua num = box.unpack('l', tu[0])
+---
+...
+lua print(num)
+---
+18446744073709551615
+...
+lua type(num) == 'cdata'
+---
+ - true
+...
+lua num == tonumber64('18446744073709551615')
+---
+ - true
+...
diff --git a/test/box_big/lua.test b/test/box_big/lua.test
index 5ffd5a9039b9b72e20a8f388e3069aa6f11d2eee..0c43ab7c6b1cf0d1c50d80587cc1fa8c8102f16c 100644
--- a/test/box_big/lua.test
+++ b/test/box_big/lua.test
@@ -37,3 +37,13 @@ exec sql "insert into t5 values ('00000000', 'of', 'puppets')"
 exec sql "insert into t5 values ('00000001', 'of', 'might', 'and', 'magic')"
 exec sql "call box.select_range(5, 1, 2, 'of')"
 exec admin "lua box.space[5]:truncate()"
+
+#
+# Lua 64bit numbers support
+#
+exec admin "lua box.insert('8', tonumber64('18446744073709551615'), 'magic')"
+exec admin "lua tu = box.select('8', '0', tonumber64('18446744073709551615'))"
+exec admin "lua num = box.unpack('l', tu[0])"
+exec admin "lua print(num)"
+exec admin "lua type(num) == 'cdata'"
+exec admin "lua num == tonumber64('18446744073709551615')"
diff --git a/test/box_big/tarantool.cfg b/test/box_big/tarantool.cfg
index 6a3d5fea29b623db875bf3dcaeca265310cbec5b..ff574b31e74268e76ebb80fad58b3750ceebfa1b 100644
--- a/test/box_big/tarantool.cfg
+++ b/test/box_big/tarantool.cfg
@@ -136,3 +136,10 @@ space[7].index[1].type = "HASH"
 space[7].index[1].unique = true
 space[7].index[1].key_field[0].fieldno = 1
 space[7].index[1].key_field[0].type = "STR"
+
+# Lua 64bit numbers
+space[8].enabled = true
+space[8].index[0].type = "TREE"
+space[8].index[0].unique = 1
+space[8].index[0].key_field[0].fieldno = 0
+space[8].index[0].key_field[0].type = "NUM64"