There is one other option I’ve considered: providing a define-[something? not sure what to call it]-type which gives you a disjoint type whose field size is determined at instance construction time, not at type definition time.
This would let you implement subtyping yourself with near-native efficiency – only two problems:
1. you’d still need the bounds check although it’ll be pointless in 99.99% of cases
2. you still stomp the ability to do compile-time instantiation