In what way does the vtable being attached to the value cause different semantics (what you describe sounds like an implementation detail)?  In particular, you can have Box&lt;TraitObject&gt; which has effectively identical semantics to TraitObject; yes, it&#x27;s a fat pointer, but from the perspective of the trait itself there&#x27;s no way to tell that this is the case.  Anyway, the only ways I can think of to usefully differentiate the fat from a thin pointer in a parametric function are those in which Rust already fails to have proper parametricity for any type (including being able to access its type_id).