Type argument does not conform to upper bound

Ok, then I tried an intersection type and it helps.

scala> trait X[T <: X[T, U], U <: Z[T, U]]
     | trait Y[T <: X[T, U], U <: Z[T, U] & Y[T, U]]
     | trait Z[T <: X[T, U], U <: Z[T, U]] extends Y[T, U]
// defined trait X
// defined trait Y
// defined trait Z