¿Por qué ciertas proyecciones de tipo son rechazadas y no son ligeramente diferentes?

Perdón por el título no descriptivo. El cálculo de nivel de tipo no es un tema demasiado común en Internet para establecer términos precisos.

Traté de usar cálculos de nivel de tipo y de repente obtuve errores espurios de vez en cuando. Simplemente no podía entender por qué importa tan poca diferencia. Logré forjar otro ejemplo conciso:

trait Sample {
  type X
  type DX[I <: X] <: Nothing
  type EX[I <: X] = Nothing
}
type Aux[I] = Sample {type X = I}

type U1 = Aux[Int]#DX[Int] // ok
type U2 = Aux[Int]#EX[Int] // fails

El mensaje de error es:

error: type arguments [Int] do not conform to type EX's type parameter bounds [I <: Sample.this.X]
type U2 = Aux[Int]#EX[Int]
                   ^

Pero elEX&nbsp;yDX&nbsp;tenía los mismos límites de parámetros de tipo. ¿Por qué es correcto en un caso e incorrecto en el otro?