Here's an implementation of such: https://docs.rs/nanval/latest/nanval/
Edit: I guess one advantage is that, if we later treat the handle like a pointer, NaN math gets you NaN again, whereas the uint64 math might get you an invalid address, or you'd need extra logic to check that the uint64 is not a valid handle?
Using unsigned integers is only a better choice if your VM doesn't need efficient floating-point operations.