Earlier quoted context omitted.
Pattern-matching is not sugar over "case". Pattern-matching means that the branching primitive not only dispatches to different code based on an input tag, but also that it places different values of different types in scope according to the branch. Most languages only branch on booleans, without gaining any type information at all. This is actually a big problem and relates to the nullability problem, explained at:…
Well, he could be talking about reverse [] = [] reverse (x:xs) = reverse xs ++ [x] being sugar for reverse list = case list of [] -> [] (x:xs) -> reverse xs ++ [x] Since in that case, pattern matching on arguments is really just sugar for a case statement.
He said pattern-matching was sugar for "case/switch construct present in many, many languages". That implies pattern-matching adds only syntax to the game, and that it doesn't add any useful things beyond the "switch" you find in C or Java, for example.