diff --git a/src/lua/msgpackffi.lua b/src/lua/msgpackffi.lua
index d7fcebd69e81626b7c7d4e949f9e335c1934396f..df937a49e888e3958929701a2d4fb47fc7ab470a 100644
--- a/src/lua/msgpackffi.lua
+++ b/src/lua/msgpackffi.lua
@@ -290,34 +290,39 @@ on_encode(ffi.typeof('double'), encode_double)
 
 local decode_r
 
+local NUMBER_INT_MAX = 4503599627370496LL -- 2^52
+
 local function decode_u8(data)
     local num = ffi.cast(uint8_ptr_t, data[0])[0]
     data[0] = data[0] + 1
-    return num
+    return tonumber(num)
 end
 
 local function decode_u16(data)
     local num = bswap_u16(ffi.cast(uint16_ptr_t, data[0])[0])
     data[0] = data[0] + 2
-    return num
+    return tonumber(num)
 end
 
 local function decode_u32(data)
     local num = bswap_u32(ffi.cast(uint32_ptr_t, data[0])[0])
     data[0] = data[0] + 4
-    return num
+    return tonumber(num)
 end
 
 local function decode_u64(data)
     local num = bswap_u64(ffi.cast(uint64_ptr_t, data[0])[0])
     data[0] = data[0] + 8
-    return num
+    if num < NUMBER_INT_MAX then
+        return tonumber(num) -- return as 'number'
+    end
+    return num -- return as 'cdata'
 end
 
 local function decode_i8(data)
     local num = ffi.cast(int8_ptr_t, data[0])[0]
     data[0] = data[0] + 1
-    return num
+    return tonumber(num)
 end
 
 local function decode_i16(data)
@@ -333,9 +338,13 @@ local function decode_i32(data)
 end
 
 local function decode_i64(data)
-    local num = bswap_u64(ffi.cast(uint64_ptr_t, data[0])[0])
+    local num = ffi.cast('int64_t', ffi.cast('uint64_t',
+        bswap_u64(ffi.cast(uint64_ptr_t, data[0])[0])))
     data[0] = data[0] + 8
-    return ffi.cast('int64_t', ffi.cast('uint64_t', num))
+    if num > -NUMBER_INT_MAX and num < NUMBER_INT_MAX then
+        return tonumber(num) -- return as 'number'
+    end
+    return num -- return as 'cdata'
 end
 
 local bswap_buf = ffi.new('char[8]')
@@ -427,17 +436,15 @@ decode_r = function(data)
     local c = data[0][0]
     data[0] = data[0] + 1
     if c <= 0x7f then
-        return c -- fixint
+        return tonumber(c) -- fixint
     elseif c >= 0xa0 and c <= 0xbf then
         return decode_str(data, bit.band(c, 0x1f)) -- fixstr
     elseif c >= 0x90 and c <= 0x9f then
         return decode_array(data, bit.band(c, 0xf)) -- fixarray
     elseif c >= 0x80 and c <= 0x8f then
         return decode_map(data, bit.band(c, 0xf)) -- fixmap
-    elseif c <= 0x7f then
-        return c2
     elseif c >= 0xe0 then
-        return ffi.cast('signed char',c)
+        return tonumber(ffi.cast('signed char',c)) -- negfixint
     elseif c == 0xc0 then
         return msgpack.NULL
     elseif c == 0xc2 then
diff --git a/test/app/json.result b/test/app/json.result
index 1443f601815a6e535bdf7db203855b7e66129a4b..a899ccf6befcceeedc8a4598ba49901b2fc0a56a 100644
--- a/test/app/json.result
+++ b/test/app/json.result
@@ -2,97 +2,177 @@ TAP version 13
 # json
 1..9
     # unsigned
-    1..56
+    1..118
     ok - encode/decode for 0
+    ok - encode/decode type for 0
     ok - encode/decode for 0LL
+    ok - encode/decode type for 0LL
     ok - encode/decode for 0ULL
+    ok - encode/decode type for 0ULL
     ok - encode/decode for 1
+    ok - encode/decode type for 1
     ok - encode/decode for 1LL
+    ok - encode/decode type for 1LL
     ok - encode/decode for 1ULL
+    ok - encode/decode type for 1ULL
     ok - encode/decode for 127
+    ok - encode/decode type for 127
     ok - encode/decode for 127LL
+    ok - encode/decode type for 127LL
     ok - encode/decode for 127ULL
+    ok - encode/decode type for 127ULL
     ok - encode/decode for 128
+    ok - encode/decode type for 128
     ok - encode/decode for 128LL
+    ok - encode/decode type for 128LL
     ok - encode/decode for 128ULL
+    ok - encode/decode type for 128ULL
     ok - encode/decode for 255
+    ok - encode/decode type for 255
     ok - encode/decode for 255LL
+    ok - encode/decode type for 255LL
     ok - encode/decode for 255ULL
+    ok - encode/decode type for 255ULL
     ok - encode/decode for 256
+    ok - encode/decode type for 256
     ok - encode/decode for 256LL
+    ok - encode/decode type for 256LL
     ok - encode/decode for 256ULL
+    ok - encode/decode type for 256ULL
     ok - encode/decode for 65535
+    ok - encode/decode type for 65535
     ok - encode/decode for 65535LL
+    ok - encode/decode type for 65535LL
     ok - encode/decode for 65535ULL
+    ok - encode/decode type for 65535ULL
     ok - encode/decode for 65536
+    ok - encode/decode type for 65536
     ok - encode/decode for 65536LL
+    ok - encode/decode type for 65536LL
     ok - encode/decode for 65536ULL
+    ok - encode/decode type for 65536ULL
     ok - encode/decode for 4294967294
+    ok - encode/decode type for 4294967294
     ok - encode/decode for 4294967294LL
+    ok - encode/decode type for 4294967294LL
     ok - encode/decode for 4294967294ULL
+    ok - encode/decode type for 4294967294ULL
     ok - encode/decode for 4294967295
+    ok - encode/decode type for 4294967295
     ok - encode/decode for 4294967295LL
+    ok - encode/decode type for 4294967295LL
     ok - encode/decode for 4294967295ULL
+    ok - encode/decode type for 4294967295ULL
     ok - encode/decode for 4294967296
+    ok - encode/decode type for 4294967296
     ok - encode/decode for 4294967296LL
+    ok - encode/decode type for 4294967296LL
     ok - encode/decode for 4294967296ULL
+    ok - encode/decode type for 4294967296ULL
     ok - encode/decode for 4294967297
+    ok - encode/decode type for 4294967297
     ok - encode/decode for 4294967297LL
+    ok - encode/decode type for 4294967297LL
     ok - encode/decode for 4294967297ULL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740992LL
-    ok - encode/decode for 9007199254740992ULL
+    ok - encode/decode type for 4294967297ULL
+    ok - encode/decode for 4.5035996273705e+15
+    ok - encode/decode type for 4.5035996273705e+15
+    ok - encode/decode for 4503599627370495LL
+    ok - encode/decode type for 4503599627370495LL
+    ok - encode/decode for 4503599627370495ULL
+    ok - encode/decode type for 4503599627370495ULL
+    ok - encode/decode for 4.5035996273705e+15
+    ok - encode/decode type for 4.5035996273705e+15
+    ok - encode/decode for 4503599627370496LL
+    ok - encode/decode type for 4503599627370496LL
+    ok - encode/decode for 4503599627370496ULL
+    ok - encode/decode type for 4503599627370496ULL
     ok - encode/decode for 9223372036854775807LL
+    ok - encode/decode type for 9223372036854775807LL
     ok - encode/decode for 9223372036854775807ULL
+    ok - encode/decode type for 9223372036854775807ULL
     ok - encode/decode for 9223372036854775808ULL
+    ok - encode/decode type for 9223372036854775808ULL
     ok - encode/decode for 9223372036854775809ULL
+    ok - encode/decode type for 9223372036854775809ULL
     ok - encode/decode for 18446744073709551614ULL
+    ok - encode/decode type for 18446744073709551614ULL
     ok - encode/decode for 18446744073709551615ULL
+    ok - encode/decode type for 18446744073709551615ULL
     ok - encode/decode for 18446744073709551615ULL
+    ok - encode/decode type for 18446744073709551615ULL
     ok - encode/decode for cdata<unsigned char>:
+    ok - encode/decode type for cdata<unsigned char>:
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     ok - encode/decode for cdata<unsigned short>:
+    ok - encode/decode type for cdata<unsigned short>:
     ok - encode/decode for cdata<short>:
+    ok - encode/decode type for cdata<short>:
     ok - encode/decode for cdata<unsigned int>:
+    ok - encode/decode type for cdata<unsigned int>:
     ok - encode/decode for cdata<int>:
+    ok - encode/decode type for cdata<int>:
     ok - encode/decode for 128ULL
+    ok - encode/decode type for 128ULL
     ok - encode/decode for -128LL
+    ok - encode/decode type for -128LL
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     # unsigned: end
 ok - unsigned
     # signed
-    1..30
+    1..48
     ok - encode/decode for -1
+    ok - encode/decode type for -1
     ok - encode/decode for -1LL
+    ok - encode/decode type for -1LL
     ok - encode/decode for -31
+    ok - encode/decode type for -31
     ok - encode/decode for -31LL
+    ok - encode/decode type for -31LL
     ok - encode/decode for -32
+    ok - encode/decode type for -32
     ok - encode/decode for -32LL
+    ok - encode/decode type for -32LL
     ok - encode/decode for -127
+    ok - encode/decode type for -127
     ok - encode/decode for -127LL
+    ok - encode/decode type for -127LL
     ok - encode/decode for -128
+    ok - encode/decode type for -128
     ok - encode/decode for -128LL
+    ok - encode/decode type for -128LL
     ok - encode/decode for -32767
+    ok - encode/decode type for -32767
     ok - encode/decode for -32767LL
+    ok - encode/decode type for -32767LL
     ok - encode/decode for -32768
+    ok - encode/decode type for -32768
     ok - encode/decode for -32768LL
+    ok - encode/decode type for -32768LL
     ok - encode/decode for -2147483647
+    ok - encode/decode type for -2147483647
     ok - encode/decode for -2147483647LL
+    ok - encode/decode type for -2147483647LL
     ok - encode/decode for -2147483648
+    ok - encode/decode type for -2147483648
     ok - encode/decode for -2147483648LL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740991ULL
-    ok - encode/decode for 9007199254740991LL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740992ULL
-    ok - encode/decode for 9007199254740992LL
-    ok - encode/decode for -9.007199254741e+15
-    ok - encode/decode for -9007199254740991LL
-    ok - encode/decode for -9.007199254741e+15
-    ok - encode/decode for -9007199254740992LL
+    ok - encode/decode type for -2147483648LL
+    ok - encode/decode for -4.5035996273705e+15
+    ok - encode/decode type for -4.5035996273705e+15
+    ok - encode/decode for -4503599627370495LL
+    ok - encode/decode type for -4503599627370495LL
+    ok - encode/decode for -4.5035996273705e+15
+    ok - encode/decode type for -4.5035996273705e+15
+    ok - encode/decode for -4503599627370496LL
+    ok - encode/decode type for -4503599627370496LL
     ok - encode/decode for -9223372036854775806LL
+    ok - encode/decode type for -9223372036854775806LL
     ok - encode/decode for -9223372036854775807LL
+    ok - encode/decode type for -9223372036854775807LL
     # signed: end
 ok - signed
     # double
diff --git a/test/app/lua/serializer_test.lua b/test/app/lua/serializer_test.lua
index 3adb18518d913d8112c498d3a6ca19aeaa398d13..a5aed744031e7110ec4c1d324b19e8caad25b694 100644
--- a/test/app/lua/serializer_test.lua
+++ b/test/app/lua/serializer_test.lua
@@ -1,6 +1,6 @@
 local ffi = require('ffi')
 
-local function rt(test, s, x)
+local function rt(test, s, x, t)
     local buf1 = s.encode(x)
     local x1, offset1 = s.decode(buf1)
     local xstr
@@ -19,133 +19,131 @@ local function rt(test, s, x)
         xstr = tostring(x)
     end
     test:is_deeply(x, x1, "encode/decode for "..xstr)
+    if t ~= nil then
+        test:is(type(x1), t, "encode/decode type for "..xstr)
+    end
 end
 
 local function test_unsigned(test, s)
-    test:plan(56)
-    rt(test, s, 0)
-    rt(test, s, 0LL)
-    rt(test, s, 0ULL)
-
-    rt(test, s, 1)
-    rt(test, s, 1LL)
-    rt(test, s, 1ULL)
-
-    rt(test, s, 127)
-    rt(test, s, 127LL)
-    rt(test, s, 127ULL)
-
-    rt(test, s, 128)
-    rt(test, s, 128LL)
-    rt(test, s, 128ULL)
-
-    rt(test, s, 255)
-    rt(test, s, 255LL)
-    rt(test, s, 255ULL)
-
-    rt(test, s, 256)
-    rt(test, s, 256LL)
-    rt(test, s, 256ULL)
-
-    rt(test, s, 65535)
-    rt(test, s, 65535LL)
-    rt(test, s, 65535ULL)
-
-    rt(test, s, 65536)
-    rt(test, s, 65536LL)
-    rt(test, s, 65536ULL)
-
-    rt(test, s, 4294967294)
-    rt(test, s, 4294967294LL)
-    rt(test, s, 4294967294ULL)
-
-    rt(test, s, 4294967295)
-    rt(test, s, 4294967295LL)
-    rt(test, s, 4294967295ULL)
-
-    rt(test, s, 4294967296)
-    rt(test, s, 4294967296LL)
-    rt(test, s, 4294967296ULL)
-
-    rt(test, s, 4294967297)
-    rt(test, s, 4294967297LL)
-    rt(test, s, 4294967297ULL)
-
-    rt(test, s, 9007199254740992)
-    rt(test, s, 9007199254740992LL)
-    rt(test, s, 9007199254740992ULL)
-
-    rt(test, s, 9223372036854775807LL)
-    rt(test, s, 9223372036854775807ULL)
-
-    rt(test, s, 9223372036854775808ULL)
-    rt(test, s, 9223372036854775809ULL)
-    rt(test, s, 18446744073709551614ULL)
-    rt(test, s, 18446744073709551615ULL)
-
-    rt(test, s, -1ULL)
-
-    rt(test, s, ffi.new('uint8_t', 128))
-    rt(test, s, ffi.new('int8_t', -128))
-    rt(test, s, ffi.new('uint16_t', 128))
-    rt(test, s, ffi.new('int16_t', -128))
-    rt(test, s, ffi.new('uint32_t', 128))
-    rt(test, s, ffi.new('int32_t', -128))
-    rt(test, s, ffi.new('uint64_t', 128))
-    rt(test, s, ffi.new('int64_t', -128))
-
-    rt(test, s, ffi.new('char', 128))
-    rt(test, s, ffi.new('char', -128))
+    test:plan(118)
+    rt(test, s, 0, "number")
+    rt(test, s, 0LL, "number")
+    rt(test, s, 0ULL, "number")
+
+    rt(test, s, 1, "number")
+    rt(test, s, 1LL, "number")
+    rt(test, s, 1ULL, "number")
+
+    rt(test, s, 127, "number")
+    rt(test, s, 127LL, "number")
+    rt(test, s, 127ULL, "number")
+
+    rt(test, s, 128, "number")
+    rt(test, s, 128LL, "number")
+    rt(test, s, 128ULL, "number")
+
+    rt(test, s, 255, "number")
+    rt(test, s, 255LL, "number")
+    rt(test, s, 255ULL, "number")
+
+    rt(test, s, 256, "number")
+    rt(test, s, 256LL, "number")
+    rt(test, s, 256ULL, "number")
+
+    rt(test, s, 65535, "number")
+    rt(test, s, 65535LL, "number")
+    rt(test, s, 65535ULL, "number")
+
+    rt(test, s, 65536, "number")
+    rt(test, s, 65536LL, "number")
+    rt(test, s, 65536ULL, "number")
+
+    rt(test, s, 4294967294, "number")
+    rt(test, s, 4294967294LL, "number")
+    rt(test, s, 4294967294ULL, "number")
+
+    rt(test, s, 4294967295, "number")
+    rt(test, s, 4294967295LL, "number")
+    rt(test, s, 4294967295ULL, "number")
+
+    rt(test, s, 4294967296, "number")
+    rt(test, s, 4294967296LL, "number")
+    rt(test, s, 4294967296ULL, "number")
+
+    rt(test, s, 4294967297, "number")
+    rt(test, s, 4294967297LL, "number")
+    rt(test, s, 4294967297ULL, "number")
+
+    -- 1e52 - maximum int that can be stored to double without losing precision
+    rt(test, s, 4503599627370495, "number")
+    rt(test, s, 4503599627370495LL, "number")
+    rt(test, s, 4503599627370495ULL, "number")
+    rt(test, s, 4503599627370496, "cdata")
+    rt(test, s, 4503599627370496LL, "cdata")
+    rt(test, s, 4503599627370496ULL, "cdata")
+
+    rt(test, s, 9223372036854775807LL, "cdata")
+    rt(test, s, 9223372036854775807ULL, "cdata")
+
+    rt(test, s, 9223372036854775808ULL, "cdata")
+    rt(test, s, 9223372036854775809ULL, "cdata")
+    rt(test, s, 18446744073709551614ULL, "cdata")
+    rt(test, s, 18446744073709551615ULL, "cdata")
+
+    rt(test, s, -1ULL, "cdata")
+
+    rt(test, s, ffi.new('uint8_t', 128), 'number')
+    rt(test, s, ffi.new('int8_t', -128), 'number')
+    rt(test, s, ffi.new('uint16_t', 128), 'number')
+    rt(test, s, ffi.new('int16_t', -128), 'number')
+    rt(test, s, ffi.new('uint32_t', 128), 'number')
+    rt(test, s, ffi.new('int32_t', -128), 'number')
+    rt(test, s, ffi.new('uint64_t', 128), 'number')
+    rt(test, s, ffi.new('int64_t', -128), 'number')
+
+    rt(test, s, ffi.new('char', 128), 'number')
+    rt(test, s, ffi.new('char', -128), 'number')
 end
 
 local function test_signed(test, s)
-    test:plan(30)
-
-    rt(test, s, -1)
-    rt(test, s, -1LL)
-
-    rt(test, s, -31)
-    rt(test, s, -31LL)
-
-    rt(test, s, -32)
-    rt(test, s, -32LL)
+    test:plan(48)
 
-    rt(test, s, -127)
-    rt(test, s, -127LL)
+    rt(test, s, -1, 'number')
+    rt(test, s, -1LL, 'number')
 
-    rt(test, s, -128)
-    rt(test, s, -128LL)
+    rt(test, s, -31, 'number')
+    rt(test, s, -31LL, 'number')
 
-    rt(test, s, -32767)
-    rt(test, s, -32767LL)
+    rt(test, s, -32, 'number')
+    rt(test, s, -32LL, 'number')
 
-    rt(test, s, -32768)
-    rt(test, s, -32768LL)
+    rt(test, s, -127, 'number')
+    rt(test, s, -127LL, 'number')
 
-    rt(test, s, -2147483647)
-    rt(test, s, -2147483647LL)
+    rt(test, s, -128, 'number')
+    rt(test, s, -128LL, 'number')
 
-    rt(test, s, -2147483648)
-    rt(test, s, -2147483648LL)
+    rt(test, s, -32767, 'number')
+    rt(test, s, -32767LL, 'number')
 
-    -- 1e53 - maximum int that can be stored to double without losing precision
+    rt(test, s, -32768, 'number')
+    rt(test, s, -32768LL, 'number')
 
-    rt(test, s, 9007199254740991)
-    rt(test, s, 9007199254740991ULL)
-    rt(test, s, 9007199254740991LL)
+    rt(test, s, -2147483647, 'number')
+    rt(test, s, -2147483647LL, 'number')
 
-    rt(test, s, 9007199254740992)
-    rt(test, s, 9007199254740992ULL)
-    rt(test, s, 9007199254740992LL)
+    rt(test, s, -2147483648, 'number')
+    rt(test, s, -2147483648LL, 'number')
 
-    rt(test, s, -9007199254740991)
-    rt(test, s, -9007199254740991LL)
-    rt(test, s, -9007199254740992)
-    rt(test, s, -9007199254740992LL)
+    -- 1e52 - maximum int that can be stored to double without losing precision
+    rt(test, s, -4503599627370495, "number")
+    rt(test, s, -4503599627370495LL, "number")
+    rt(test, s, -4503599627370496, "cdata")
+    rt(test, s, -4503599627370496LL, "cdata")
 
-    rt(test, s, -9223372036854775806LL)
+    rt(test, s, -9223372036854775806LL, 'cdata')
 
-    rt(test, s, -9223372036854775807LL)
+    rt(test, s, -9223372036854775807LL, 'cdata')
 end
 
 local function test_double(test, s)
diff --git a/test/app/msgpack.result b/test/app/msgpack.result
index 2c2a66a09075b037b4106acc3a0a305c31409053..986a733911f46099b12397919fb37f94b885b1f5 100644
--- a/test/app/msgpack.result
+++ b/test/app/msgpack.result
@@ -2,97 +2,177 @@ TAP version 13
 # msgpack
 1..9
     # unsigned
-    1..56
+    1..118
     ok - encode/decode for 0
+    ok - encode/decode type for 0
     ok - encode/decode for 0LL
+    ok - encode/decode type for 0LL
     ok - encode/decode for 0ULL
+    ok - encode/decode type for 0ULL
     ok - encode/decode for 1
+    ok - encode/decode type for 1
     ok - encode/decode for 1LL
+    ok - encode/decode type for 1LL
     ok - encode/decode for 1ULL
+    ok - encode/decode type for 1ULL
     ok - encode/decode for 127
+    ok - encode/decode type for 127
     ok - encode/decode for 127LL
+    ok - encode/decode type for 127LL
     ok - encode/decode for 127ULL
+    ok - encode/decode type for 127ULL
     ok - encode/decode for 128
+    ok - encode/decode type for 128
     ok - encode/decode for 128LL
+    ok - encode/decode type for 128LL
     ok - encode/decode for 128ULL
+    ok - encode/decode type for 128ULL
     ok - encode/decode for 255
+    ok - encode/decode type for 255
     ok - encode/decode for 255LL
+    ok - encode/decode type for 255LL
     ok - encode/decode for 255ULL
+    ok - encode/decode type for 255ULL
     ok - encode/decode for 256
+    ok - encode/decode type for 256
     ok - encode/decode for 256LL
+    ok - encode/decode type for 256LL
     ok - encode/decode for 256ULL
+    ok - encode/decode type for 256ULL
     ok - encode/decode for 65535
+    ok - encode/decode type for 65535
     ok - encode/decode for 65535LL
+    ok - encode/decode type for 65535LL
     ok - encode/decode for 65535ULL
+    ok - encode/decode type for 65535ULL
     ok - encode/decode for 65536
+    ok - encode/decode type for 65536
     ok - encode/decode for 65536LL
+    ok - encode/decode type for 65536LL
     ok - encode/decode for 65536ULL
+    ok - encode/decode type for 65536ULL
     ok - encode/decode for 4294967294
+    ok - encode/decode type for 4294967294
     ok - encode/decode for 4294967294LL
+    ok - encode/decode type for 4294967294LL
     ok - encode/decode for 4294967294ULL
+    ok - encode/decode type for 4294967294ULL
     ok - encode/decode for 4294967295
+    ok - encode/decode type for 4294967295
     ok - encode/decode for 4294967295LL
+    ok - encode/decode type for 4294967295LL
     ok - encode/decode for 4294967295ULL
+    ok - encode/decode type for 4294967295ULL
     ok - encode/decode for 4294967296
+    ok - encode/decode type for 4294967296
     ok - encode/decode for 4294967296LL
+    ok - encode/decode type for 4294967296LL
     ok - encode/decode for 4294967296ULL
+    ok - encode/decode type for 4294967296ULL
     ok - encode/decode for 4294967297
+    ok - encode/decode type for 4294967297
     ok - encode/decode for 4294967297LL
+    ok - encode/decode type for 4294967297LL
     ok - encode/decode for 4294967297ULL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740992LL
-    ok - encode/decode for 9007199254740992ULL
+    ok - encode/decode type for 4294967297ULL
+    ok - encode/decode for 4.5035996273705e+15
+    ok - encode/decode type for 4.5035996273705e+15
+    ok - encode/decode for 4503599627370495LL
+    ok - encode/decode type for 4503599627370495LL
+    ok - encode/decode for 4503599627370495ULL
+    ok - encode/decode type for 4503599627370495ULL
+    ok - encode/decode for 4.5035996273705e+15
+    ok - encode/decode type for 4.5035996273705e+15
+    ok - encode/decode for 4503599627370496LL
+    ok - encode/decode type for 4503599627370496LL
+    ok - encode/decode for 4503599627370496ULL
+    ok - encode/decode type for 4503599627370496ULL
     ok - encode/decode for 9223372036854775807LL
+    ok - encode/decode type for 9223372036854775807LL
     ok - encode/decode for 9223372036854775807ULL
+    ok - encode/decode type for 9223372036854775807ULL
     ok - encode/decode for 9223372036854775808ULL
+    ok - encode/decode type for 9223372036854775808ULL
     ok - encode/decode for 9223372036854775809ULL
+    ok - encode/decode type for 9223372036854775809ULL
     ok - encode/decode for 18446744073709551614ULL
+    ok - encode/decode type for 18446744073709551614ULL
     ok - encode/decode for 18446744073709551615ULL
+    ok - encode/decode type for 18446744073709551615ULL
     ok - encode/decode for 18446744073709551615ULL
+    ok - encode/decode type for 18446744073709551615ULL
     ok - encode/decode for cdata<unsigned char>:
+    ok - encode/decode type for cdata<unsigned char>:
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     ok - encode/decode for cdata<unsigned short>:
+    ok - encode/decode type for cdata<unsigned short>:
     ok - encode/decode for cdata<short>:
+    ok - encode/decode type for cdata<short>:
     ok - encode/decode for cdata<unsigned int>:
+    ok - encode/decode type for cdata<unsigned int>:
     ok - encode/decode for cdata<int>:
+    ok - encode/decode type for cdata<int>:
     ok - encode/decode for 128ULL
+    ok - encode/decode type for 128ULL
     ok - encode/decode for -128LL
+    ok - encode/decode type for -128LL
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     # unsigned: end
 ok - unsigned
     # signed
-    1..30
+    1..48
     ok - encode/decode for -1
+    ok - encode/decode type for -1
     ok - encode/decode for -1LL
+    ok - encode/decode type for -1LL
     ok - encode/decode for -31
+    ok - encode/decode type for -31
     ok - encode/decode for -31LL
+    ok - encode/decode type for -31LL
     ok - encode/decode for -32
+    ok - encode/decode type for -32
     ok - encode/decode for -32LL
+    ok - encode/decode type for -32LL
     ok - encode/decode for -127
+    ok - encode/decode type for -127
     ok - encode/decode for -127LL
+    ok - encode/decode type for -127LL
     ok - encode/decode for -128
+    ok - encode/decode type for -128
     ok - encode/decode for -128LL
+    ok - encode/decode type for -128LL
     ok - encode/decode for -32767
+    ok - encode/decode type for -32767
     ok - encode/decode for -32767LL
+    ok - encode/decode type for -32767LL
     ok - encode/decode for -32768
+    ok - encode/decode type for -32768
     ok - encode/decode for -32768LL
+    ok - encode/decode type for -32768LL
     ok - encode/decode for -2147483647
+    ok - encode/decode type for -2147483647
     ok - encode/decode for -2147483647LL
+    ok - encode/decode type for -2147483647LL
     ok - encode/decode for -2147483648
+    ok - encode/decode type for -2147483648
     ok - encode/decode for -2147483648LL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740991ULL
-    ok - encode/decode for 9007199254740991LL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740992ULL
-    ok - encode/decode for 9007199254740992LL
-    ok - encode/decode for -9.007199254741e+15
-    ok - encode/decode for -9007199254740991LL
-    ok - encode/decode for -9.007199254741e+15
-    ok - encode/decode for -9007199254740992LL
+    ok - encode/decode type for -2147483648LL
+    ok - encode/decode for -4.5035996273705e+15
+    ok - encode/decode type for -4.5035996273705e+15
+    ok - encode/decode for -4503599627370495LL
+    ok - encode/decode type for -4503599627370495LL
+    ok - encode/decode for -4.5035996273705e+15
+    ok - encode/decode type for -4.5035996273705e+15
+    ok - encode/decode for -4503599627370496LL
+    ok - encode/decode type for -4503599627370496LL
     ok - encode/decode for -9223372036854775806LL
+    ok - encode/decode type for -9223372036854775806LL
     ok - encode/decode for -9223372036854775807LL
+    ok - encode/decode type for -9223372036854775807LL
     # signed: end
 ok - signed
     # double
diff --git a/test/app/msgpackffi.result b/test/app/msgpackffi.result
index 8432aab5d79be25eba8cce3899bbe2c893080df2..1a966dcc71c737460be5c66d325568f73c1b102b 100644
--- a/test/app/msgpackffi.result
+++ b/test/app/msgpackffi.result
@@ -2,97 +2,177 @@ TAP version 13
 # msgpackffi
 1..9
     # unsigned
-    1..56
+    1..118
     ok - encode/decode for 0
+    ok - encode/decode type for 0
     ok - encode/decode for 0LL
+    ok - encode/decode type for 0LL
     ok - encode/decode for 0ULL
+    ok - encode/decode type for 0ULL
     ok - encode/decode for 1
+    ok - encode/decode type for 1
     ok - encode/decode for 1LL
+    ok - encode/decode type for 1LL
     ok - encode/decode for 1ULL
+    ok - encode/decode type for 1ULL
     ok - encode/decode for 127
+    ok - encode/decode type for 127
     ok - encode/decode for 127LL
+    ok - encode/decode type for 127LL
     ok - encode/decode for 127ULL
+    ok - encode/decode type for 127ULL
     ok - encode/decode for 128
+    ok - encode/decode type for 128
     ok - encode/decode for 128LL
+    ok - encode/decode type for 128LL
     ok - encode/decode for 128ULL
+    ok - encode/decode type for 128ULL
     ok - encode/decode for 255
+    ok - encode/decode type for 255
     ok - encode/decode for 255LL
+    ok - encode/decode type for 255LL
     ok - encode/decode for 255ULL
+    ok - encode/decode type for 255ULL
     ok - encode/decode for 256
+    ok - encode/decode type for 256
     ok - encode/decode for 256LL
+    ok - encode/decode type for 256LL
     ok - encode/decode for 256ULL
+    ok - encode/decode type for 256ULL
     ok - encode/decode for 65535
+    ok - encode/decode type for 65535
     ok - encode/decode for 65535LL
+    ok - encode/decode type for 65535LL
     ok - encode/decode for 65535ULL
+    ok - encode/decode type for 65535ULL
     ok - encode/decode for 65536
+    ok - encode/decode type for 65536
     ok - encode/decode for 65536LL
+    ok - encode/decode type for 65536LL
     ok - encode/decode for 65536ULL
+    ok - encode/decode type for 65536ULL
     ok - encode/decode for 4294967294
+    ok - encode/decode type for 4294967294
     ok - encode/decode for 4294967294LL
+    ok - encode/decode type for 4294967294LL
     ok - encode/decode for 4294967294ULL
+    ok - encode/decode type for 4294967294ULL
     ok - encode/decode for 4294967295
+    ok - encode/decode type for 4294967295
     ok - encode/decode for 4294967295LL
+    ok - encode/decode type for 4294967295LL
     ok - encode/decode for 4294967295ULL
+    ok - encode/decode type for 4294967295ULL
     ok - encode/decode for 4294967296
+    ok - encode/decode type for 4294967296
     ok - encode/decode for 4294967296LL
+    ok - encode/decode type for 4294967296LL
     ok - encode/decode for 4294967296ULL
+    ok - encode/decode type for 4294967296ULL
     ok - encode/decode for 4294967297
+    ok - encode/decode type for 4294967297
     ok - encode/decode for 4294967297LL
+    ok - encode/decode type for 4294967297LL
     ok - encode/decode for 4294967297ULL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740992LL
-    ok - encode/decode for 9007199254740992ULL
+    ok - encode/decode type for 4294967297ULL
+    ok - encode/decode for 4.5035996273705e+15
+    ok - encode/decode type for 4.5035996273705e+15
+    ok - encode/decode for 4503599627370495LL
+    ok - encode/decode type for 4503599627370495LL
+    ok - encode/decode for 4503599627370495ULL
+    ok - encode/decode type for 4503599627370495ULL
+    ok - encode/decode for 4.5035996273705e+15
+    ok - encode/decode type for 4.5035996273705e+15
+    ok - encode/decode for 4503599627370496LL
+    ok - encode/decode type for 4503599627370496LL
+    ok - encode/decode for 4503599627370496ULL
+    ok - encode/decode type for 4503599627370496ULL
     ok - encode/decode for 9223372036854775807LL
+    ok - encode/decode type for 9223372036854775807LL
     ok - encode/decode for 9223372036854775807ULL
+    ok - encode/decode type for 9223372036854775807ULL
     ok - encode/decode for 9223372036854775808ULL
+    ok - encode/decode type for 9223372036854775808ULL
     ok - encode/decode for 9223372036854775809ULL
+    ok - encode/decode type for 9223372036854775809ULL
     ok - encode/decode for 18446744073709551614ULL
+    ok - encode/decode type for 18446744073709551614ULL
     ok - encode/decode for 18446744073709551615ULL
+    ok - encode/decode type for 18446744073709551615ULL
     ok - encode/decode for 18446744073709551615ULL
+    ok - encode/decode type for 18446744073709551615ULL
     ok - encode/decode for cdata<unsigned char>:
+    ok - encode/decode type for cdata<unsigned char>:
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     ok - encode/decode for cdata<unsigned short>:
+    ok - encode/decode type for cdata<unsigned short>:
     ok - encode/decode for cdata<short>:
+    ok - encode/decode type for cdata<short>:
     ok - encode/decode for cdata<unsigned int>:
+    ok - encode/decode type for cdata<unsigned int>:
     ok - encode/decode for cdata<int>:
+    ok - encode/decode type for cdata<int>:
     ok - encode/decode for 128ULL
+    ok - encode/decode type for 128ULL
     ok - encode/decode for -128LL
+    ok - encode/decode type for -128LL
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     # unsigned: end
 ok - unsigned
     # signed
-    1..30
+    1..48
     ok - encode/decode for -1
+    ok - encode/decode type for -1
     ok - encode/decode for -1LL
+    ok - encode/decode type for -1LL
     ok - encode/decode for -31
+    ok - encode/decode type for -31
     ok - encode/decode for -31LL
+    ok - encode/decode type for -31LL
     ok - encode/decode for -32
+    ok - encode/decode type for -32
     ok - encode/decode for -32LL
+    ok - encode/decode type for -32LL
     ok - encode/decode for -127
+    ok - encode/decode type for -127
     ok - encode/decode for -127LL
+    ok - encode/decode type for -127LL
     ok - encode/decode for -128
+    ok - encode/decode type for -128
     ok - encode/decode for -128LL
+    ok - encode/decode type for -128LL
     ok - encode/decode for -32767
+    ok - encode/decode type for -32767
     ok - encode/decode for -32767LL
+    ok - encode/decode type for -32767LL
     ok - encode/decode for -32768
+    ok - encode/decode type for -32768
     ok - encode/decode for -32768LL
+    ok - encode/decode type for -32768LL
     ok - encode/decode for -2147483647
+    ok - encode/decode type for -2147483647
     ok - encode/decode for -2147483647LL
+    ok - encode/decode type for -2147483647LL
     ok - encode/decode for -2147483648
+    ok - encode/decode type for -2147483648
     ok - encode/decode for -2147483648LL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740991ULL
-    ok - encode/decode for 9007199254740991LL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740992ULL
-    ok - encode/decode for 9007199254740992LL
-    ok - encode/decode for -9.007199254741e+15
-    ok - encode/decode for -9007199254740991LL
-    ok - encode/decode for -9.007199254741e+15
-    ok - encode/decode for -9007199254740992LL
+    ok - encode/decode type for -2147483648LL
+    ok - encode/decode for -4.5035996273705e+15
+    ok - encode/decode type for -4.5035996273705e+15
+    ok - encode/decode for -4503599627370495LL
+    ok - encode/decode type for -4503599627370495LL
+    ok - encode/decode for -4.5035996273705e+15
+    ok - encode/decode type for -4.5035996273705e+15
+    ok - encode/decode for -4503599627370496LL
+    ok - encode/decode type for -4503599627370496LL
     ok - encode/decode for -9223372036854775806LL
+    ok - encode/decode type for -9223372036854775806LL
     ok - encode/decode for -9223372036854775807LL
+    ok - encode/decode type for -9223372036854775807LL
     # signed: end
 ok - signed
     # double
diff --git a/test/app/yaml.result b/test/app/yaml.result
index d952c0323f8ecc803b1ebcbfc937936535a248f7..872f589c6425066d75f58ca6ec693bfee034e7be 100644
--- a/test/app/yaml.result
+++ b/test/app/yaml.result
@@ -2,97 +2,177 @@ TAP version 13
 # yaml
 1..10
     # unsigned
-    1..56
+    1..118
     ok - encode/decode for 0
+    ok - encode/decode type for 0
     ok - encode/decode for 0LL
+    ok - encode/decode type for 0LL
     ok - encode/decode for 0ULL
+    ok - encode/decode type for 0ULL
     ok - encode/decode for 1
+    ok - encode/decode type for 1
     ok - encode/decode for 1LL
+    ok - encode/decode type for 1LL
     ok - encode/decode for 1ULL
+    ok - encode/decode type for 1ULL
     ok - encode/decode for 127
+    ok - encode/decode type for 127
     ok - encode/decode for 127LL
+    ok - encode/decode type for 127LL
     ok - encode/decode for 127ULL
+    ok - encode/decode type for 127ULL
     ok - encode/decode for 128
+    ok - encode/decode type for 128
     ok - encode/decode for 128LL
+    ok - encode/decode type for 128LL
     ok - encode/decode for 128ULL
+    ok - encode/decode type for 128ULL
     ok - encode/decode for 255
+    ok - encode/decode type for 255
     ok - encode/decode for 255LL
+    ok - encode/decode type for 255LL
     ok - encode/decode for 255ULL
+    ok - encode/decode type for 255ULL
     ok - encode/decode for 256
+    ok - encode/decode type for 256
     ok - encode/decode for 256LL
+    ok - encode/decode type for 256LL
     ok - encode/decode for 256ULL
+    ok - encode/decode type for 256ULL
     ok - encode/decode for 65535
+    ok - encode/decode type for 65535
     ok - encode/decode for 65535LL
+    ok - encode/decode type for 65535LL
     ok - encode/decode for 65535ULL
+    ok - encode/decode type for 65535ULL
     ok - encode/decode for 65536
+    ok - encode/decode type for 65536
     ok - encode/decode for 65536LL
+    ok - encode/decode type for 65536LL
     ok - encode/decode for 65536ULL
+    ok - encode/decode type for 65536ULL
     ok - encode/decode for 4294967294
+    ok - encode/decode type for 4294967294
     ok - encode/decode for 4294967294LL
+    ok - encode/decode type for 4294967294LL
     ok - encode/decode for 4294967294ULL
+    ok - encode/decode type for 4294967294ULL
     ok - encode/decode for 4294967295
+    ok - encode/decode type for 4294967295
     ok - encode/decode for 4294967295LL
+    ok - encode/decode type for 4294967295LL
     ok - encode/decode for 4294967295ULL
+    ok - encode/decode type for 4294967295ULL
     ok - encode/decode for 4294967296
+    ok - encode/decode type for 4294967296
     ok - encode/decode for 4294967296LL
+    ok - encode/decode type for 4294967296LL
     ok - encode/decode for 4294967296ULL
+    ok - encode/decode type for 4294967296ULL
     ok - encode/decode for 4294967297
+    ok - encode/decode type for 4294967297
     ok - encode/decode for 4294967297LL
+    ok - encode/decode type for 4294967297LL
     ok - encode/decode for 4294967297ULL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740992LL
-    ok - encode/decode for 9007199254740992ULL
+    ok - encode/decode type for 4294967297ULL
+    ok - encode/decode for 4.5035996273705e+15
+    ok - encode/decode type for 4.5035996273705e+15
+    ok - encode/decode for 4503599627370495LL
+    ok - encode/decode type for 4503599627370495LL
+    ok - encode/decode for 4503599627370495ULL
+    ok - encode/decode type for 4503599627370495ULL
+    ok - encode/decode for 4.5035996273705e+15
+    ok - encode/decode type for 4.5035996273705e+15
+    ok - encode/decode for 4503599627370496LL
+    ok - encode/decode type for 4503599627370496LL
+    ok - encode/decode for 4503599627370496ULL
+    ok - encode/decode type for 4503599627370496ULL
     ok - encode/decode for 9223372036854775807LL
+    ok - encode/decode type for 9223372036854775807LL
     ok - encode/decode for 9223372036854775807ULL
+    ok - encode/decode type for 9223372036854775807ULL
     ok - encode/decode for 9223372036854775808ULL
+    ok - encode/decode type for 9223372036854775808ULL
     ok - encode/decode for 9223372036854775809ULL
+    ok - encode/decode type for 9223372036854775809ULL
     ok - encode/decode for 18446744073709551614ULL
+    ok - encode/decode type for 18446744073709551614ULL
     ok - encode/decode for 18446744073709551615ULL
+    ok - encode/decode type for 18446744073709551615ULL
     ok - encode/decode for 18446744073709551615ULL
+    ok - encode/decode type for 18446744073709551615ULL
     ok - encode/decode for cdata<unsigned char>:
+    ok - encode/decode type for cdata<unsigned char>:
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     ok - encode/decode for cdata<unsigned short>:
+    ok - encode/decode type for cdata<unsigned short>:
     ok - encode/decode for cdata<short>:
+    ok - encode/decode type for cdata<short>:
     ok - encode/decode for cdata<unsigned int>:
+    ok - encode/decode type for cdata<unsigned int>:
     ok - encode/decode for cdata<int>:
+    ok - encode/decode type for cdata<int>:
     ok - encode/decode for 128ULL
+    ok - encode/decode type for 128ULL
     ok - encode/decode for -128LL
+    ok - encode/decode type for -128LL
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     ok - encode/decode for cdata<char>:
+    ok - encode/decode type for cdata<char>:
     # unsigned: end
 ok - unsigned
     # signed
-    1..30
+    1..48
     ok - encode/decode for -1
+    ok - encode/decode type for -1
     ok - encode/decode for -1LL
+    ok - encode/decode type for -1LL
     ok - encode/decode for -31
+    ok - encode/decode type for -31
     ok - encode/decode for -31LL
+    ok - encode/decode type for -31LL
     ok - encode/decode for -32
+    ok - encode/decode type for -32
     ok - encode/decode for -32LL
+    ok - encode/decode type for -32LL
     ok - encode/decode for -127
+    ok - encode/decode type for -127
     ok - encode/decode for -127LL
+    ok - encode/decode type for -127LL
     ok - encode/decode for -128
+    ok - encode/decode type for -128
     ok - encode/decode for -128LL
+    ok - encode/decode type for -128LL
     ok - encode/decode for -32767
+    ok - encode/decode type for -32767
     ok - encode/decode for -32767LL
+    ok - encode/decode type for -32767LL
     ok - encode/decode for -32768
+    ok - encode/decode type for -32768
     ok - encode/decode for -32768LL
+    ok - encode/decode type for -32768LL
     ok - encode/decode for -2147483647
+    ok - encode/decode type for -2147483647
     ok - encode/decode for -2147483647LL
+    ok - encode/decode type for -2147483647LL
     ok - encode/decode for -2147483648
+    ok - encode/decode type for -2147483648
     ok - encode/decode for -2147483648LL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740991ULL
-    ok - encode/decode for 9007199254740991LL
-    ok - encode/decode for 9.007199254741e+15
-    ok - encode/decode for 9007199254740992ULL
-    ok - encode/decode for 9007199254740992LL
-    ok - encode/decode for -9.007199254741e+15
-    ok - encode/decode for -9007199254740991LL
-    ok - encode/decode for -9.007199254741e+15
-    ok - encode/decode for -9007199254740992LL
+    ok - encode/decode type for -2147483648LL
+    ok - encode/decode for -4.5035996273705e+15
+    ok - encode/decode type for -4.5035996273705e+15
+    ok - encode/decode for -4503599627370495LL
+    ok - encode/decode type for -4503599627370495LL
+    ok - encode/decode for -4.5035996273705e+15
+    ok - encode/decode type for -4.5035996273705e+15
+    ok - encode/decode for -4503599627370496LL
+    ok - encode/decode type for -4503599627370496LL
     ok - encode/decode for -9223372036854775806LL
+    ok - encode/decode type for -9223372036854775806LL
     ok - encode/decode for -9223372036854775807LL
+    ok - encode/decode type for -9223372036854775807LL
     # signed: end
 ok - signed
     # double