&gt; <i>You can use, for example, elaborate if-else constructs that firstly try to determine type of the value, then check for values.</i><p>That&#x27;s dynamic typing.  Very different from pattern matching over sum types: with dynamic typing, you can basically forget about most compile time guarantees. Seriously, you sound like, &quot;why bother with Ocaml when JavaScript does the same thing?&quot;.  I can tell you from first hand experience that they do not feel the same at all.<p>The other classic example, class hierarchies, is also very different from pattern matching —and much more cumbersome.  The only language I know of that kinda bridged the two is Scala, with case classes.