The type systems in modern languages like Swift, Rust, Scala, Haskell, and even Kotlin go way beyond classical Hindley-Milner.  Classical Hindley-Milner gives you parametric polymorphism over algebraic data types, along with an inference algorithm.  No subtyping, no casts, no coercions, no overloading, no polymorphic literals, no interfaces.  You basically get SML.<p>Consider that in 2006, MPTCs with fundeps was the preferred way to represent &quot;a collection of items that can be compared via equality&quot; [1].  Associated types were a vague research idea [2] that showed a lot of promise, but hadn&#x27;t been implemented in any language with type inference (they did exist in C++ templates, but C++ isn&#x27;t exactly what people think of when you say &quot;modern type system&quot;).  Now both Rust and Swift feature polished implementations of associated types and use them pervasively in the standard library.<p>[1] <a href="https:&#x2F;&#x2F;en.wikibooks.org&#x2F;wiki&#x2F;Haskell&#x2F;Advanced_type_classes#Multi-parameter_type_classes" rel="nofollow">https:&#x2F;&#x2F;en.wikibooks.org&#x2F;wiki&#x2F;Haskell&#x2F;Advanced_type_classes#...</a><p>[2] <a href="https:&#x2F;&#x2F;prime.haskell.org&#x2F;wiki&#x2F;AssociatedTypes" rel="nofollow">https:&#x2F;&#x2F;prime.haskell.org&#x2F;wiki&#x2F;AssociatedTypes</a>