Maybe we should start listing the options:
(1) Some sort of C++/Java style classes – possibly simplified so only struct + interface. Basically an opaque struct + pointer to a vtable. Very simple.
Advantages: fast, well known
Disadvantages: does not solve the generic issue. Grows like a cancer.
(2) ObjC style classes - message passing.
Advantages: no need for generics at all, classes used for large scale integration and doesn't replace normal structs, very simple runtime.
Disadvantages: Slow message passing, requires a rudimentary standard lib to be useful, often misunderstood and misapplied: people think it's supposed to be used like C++.
(3) The Go approach: tagged unions.
Advantages: Similar to (1), but does not invite class creation.
Disadvantages: Does not solve the generics issue, the "interface()" problem.
(4) Virtual wrapper (see above). Basically an explicit version of the Go approach, but less inviting to "program to interfaces"
(5) The manual C way
Advantages: Simple, clear
Disadvantages: Lots of manual labour, poor clarity
Please add more to the list!
Something else?