Aha, indeed.
I was thinking more of something like this:
open class C1 { type T }
open class C2: C1() { type T = Foo }
which would be semantically equivalent to:
open class _C1<T>
open class _C2<T: Foo>: _C1<T>()
given that each occurrence of C1 is replaced by _C1<out Any> and each occurrence of C2 by _C2<out Foo> (or _C2<Foo> if C2 were final).
(In fact it would be even better to introduce two notations: type T < Foo and type T = Foo were the former would behave as in the example, and the latter would allow removing the covariance while keeping the class open, fixing T to Foo for all derived classes.)