The semantics of those are different. With trait objects the vtable is attached to the value. You could instead imagine a language with two types of trait bounds: one specialized statically (like Rust trait bounds), and the other handled dynamically (like type classes in Haskell). The semantics of these would be identical (vtable travels independently of values), the only difference is performance. I&#x27;m not sure if you&#x27;d ever want Haskell&#x27;s implementation strategy in practice though, unless you want to support features that can&#x27;t be supported by static specialization like polymorphic recursion or higher rank polymorphism (not to be confused with higher kinds). Interestingly C# does support those features <i>and</i> specialization because it specializes at run time. It&#x27;s a less known very powerful feature, at least in theory :) You can abuse it to make the CLR generate arbitrary code at run-time.