It gives you a very nice notation for checking if a value has some type and, if so, binding a new variable that refers to it as that more specific type.
How does that solve the problem of statements being devoid of return information?
Also, what? Pattern matching differentiate between values of a single type, and while the assignment mechanism is a great nice-to-have, it still completely follows the basic type consistency that actually typed functions provide.
I'm sorry, but we seem to be talking past each other.
Why is it a problem that statements are "devoid of return information"? A statement occurs in a position where, by definition, no value it produces will be used.