I don’t think it is right to say = is used in three places - == is treated as a different operator for expressions, so we should do so for types too. I.e., it makes perfect sense to use == in where clauses.

I think it is clearly the right choice for defaults too.

For associated types it is more interesting. I think the current choice is correct (although I see how reasonable people could differ on this). I don’t think of it as an equality constraint, but something akin to initialisation. Iterator<Item=u8> defines the type given by starting with Iterator and setting Item to u8 . In particular it is not the set of types I which are Iterator s and satisfy the constraint I::Item == u8 . The difference to me is what can appear on the rhs. The = syntax implies (correctly) that we can only set the associated type to a concrete type. The == syntax implies (wrongly) that we could constrain two associated types to be the same. E.g., for a trait T with two assoc types A and B , we could have a constraint in a where clause that T::A == T::B , but we could not have T<A=B> .

tl;dr, I don’t think there is a problem here