You can use Scott encoding to embed ADTs in a lambda calculus, pattern matching is just a much nicer syntax.
A more difficult sticking point is type classes, though if you translate constraints to normal arguments and do explicit dictionary passing, you can encode them in a lambda calculus.
A simply typed lambda calculus doesn’t have parametric polymorphism, so that won’t work. You could erase all the types to use a untyped lambda calculus, but the report mostly tells you how to lower to a polymorphic lambda calculus sans explicit type binders (no syntax for higher-rank types) and primitive pattern matching (only on outermost constructor; rather than going all the way to Scott encoding).
(Haskell as extended by) GHC needs polymorphic lambda calculus with explicit type binders (for higher-rank types) and some sort of (primitive?) Leibniz equality type/value to implement type equality constraints for GADTs (at least).
But, given that untyped lambda calculus is computationally equivalent to Turing machines, you can reduce any language to lambda calculus if you work hard enough at it.