It's probably worth looking at how Scala implemented value types to get an idea of a likely approach: https://docs.google.com/document/d/10TQKgMiJTbVtkdRG53wsLYwW...
The single-field restriction is there because there are limits in how aggressive one can fight a non-cooperating runtime, not because it was their principled choice.
Their idea is, IIRC, to flatten the members of a type into an array of primitives.