This seems practical for a few reasons:
Full 64-bit pointers and numbers can fit into tagged words. (No boxing and so no heap allocation for u64 and pointer arithmetic.)
Naked 64-bit values can still be stored in registers and used directly. The JIT knows the type of each register and does not need to load the tag bits (they are checked on load and added on store.)
The x86-64 target CPU is efficient for unaligned access.
We will see how this works out in practice. Link: https://github.com/raptorjit/raptorjit/pull/93