diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,5 +1,8 @@
 # Changelog for `proto-lens-protoc`
 
+## v0.4.0.2
+- Support `haskell-src-exts-1.22.*`, and remove support for `haskell-src-exts-1.17.*`.
+
 ## v0.4.0.1
 - Bump the dependency on `base` and `containers` to support `ghc-8.6.1`.
 - Fix a GHC error on enums with a very large number of cases (#241).
diff --git a/proto-lens-protoc.cabal b/proto-lens-protoc.cabal
--- a/proto-lens-protoc.cabal
+++ b/proto-lens-protoc.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: b29b62b3123ac364956fb075e47b5d2d3c55951136e89ff7972994217d0b2864
+-- hash: 71538a306f042a685e226ca1da1db154ba2609f0f69544fbe19c4d061b05325c
 
 name:           proto-lens-protoc
-version:        0.4.0.1
+version:        0.4.0.2
 synopsis:       Protocol buffer compiler for the proto-lens library.
 description:    Turn protocol buffer files (.proto) into Haskell files (.hs) which can be used with the proto-lens package.
                 The library component of this package contains compiler code (namely Data.ProtoLens.Compiler.*) is not guaranteed to have stable APIs.'
@@ -41,7 +41,7 @@
       base >=4.9 && <4.13
     , containers >=0.5 && <0.7
     , filepath >=1.4 && <1.6
-    , haskell-src-exts >=1.17 && <1.21
+    , haskell-src-exts >=1.18 && <1.22
     , lens-family ==1.2.*
     , pretty ==1.1.*
     , proto-lens ==0.4.*
diff --git a/src/Data/ProtoLens/Compiler/Combinators.hs b/src/Data/ProtoLens/Compiler/Combinators.hs
--- a/src/Data/ProtoLens/Compiler/Combinators.hs
+++ b/src/Data/ProtoLens/Compiler/Combinators.hs
@@ -26,30 +26,16 @@
 
 import Data.Char (isAlphaNum, isUpper)
 import Data.String (IsString(..))
-#if MIN_VERSION_haskell_src_exts(1,18,0)
 import qualified Language.Haskell.Exts.Syntax as Syntax
 import qualified Language.Haskell.Exts.Pretty as Pretty
-#else
-import qualified Language.Haskell.Exts.Annotated.Syntax as Syntax
-import qualified Language.Haskell.Exts.Pretty as Pretty
-import Language.Haskell.Exts.SrcLoc (SrcLoc, noLoc)
-#endif
 import Text.PrettyPrint (($+$), (<+>), render, text, vcat, Doc)
 
-#if MIN_VERSION_haskell_src_exts(1,18,0)
 prettyPrint :: Pretty.Pretty a => a -> String
 prettyPrint = Pretty.prettyPrint
 
 prettyPrim :: Pretty.Pretty a => a -> Doc
 prettyPrim = Pretty.prettyPrim
-#else
-prettyPrint :: (Functor m, Pretty.Pretty (m SrcLoc)) => m () -> String
-prettyPrint = Pretty.prettyPrint . fmap (const noLoc)
 
-prettyPrim :: (Functor m, Pretty.Pretty (m SrcLoc)) => m () -> Doc
-prettyPrim = Pretty.prettyPrim . fmap (const noLoc)
-#endif
-
 type Asst = Syntax.Asst ()
 
 classA :: QName -> [Type] -> Asst
@@ -75,7 +61,9 @@
 type Decl = Syntax.Decl ()
 
 patSynSig :: Name -> Type -> Decl
-#if MIN_VERSION_haskell_src_exts(1,20,0)
+#if MIN_VERSION_haskell_src_exts(1,21,0)
+patSynSig n t = Syntax.PatSynSig () [n] Nothing Nothing Nothing Nothing t
+#elif MIN_VERSION_haskell_src_exts(1,20,0)
 patSynSig n t = Syntax.PatSynSig () [n] Nothing Nothing Nothing t
 #else
 patSynSig n t = Syntax.PatSynSig () n Nothing Nothing Nothing t
@@ -260,21 +248,13 @@
 exportVar = Syntax.EVar ()
 
 exportAll :: QName -> ExportSpec
-#if MIN_VERSION_haskell_src_exts(1,18,0)
 exportAll q = Syntax.EThingWith () (Syntax.EWildcard () 0) q []
-#else
-exportAll = Syntax.EThingAll ()
-#endif
 
 exportWith :: QName -> [Name] -> ExportSpec
-#if MIN_VERSION_haskell_src_exts(1,18,0)
 exportWith q = Syntax.EThingWith ()
                     (Syntax.NoWildcard ())
                     q
                     . map (Syntax.ConName ())
-#else
-exportWith q = Syntax.EThingWith () q . map (Syntax.ConName ())
-#endif
 
 type Name = Syntax.Name ()
 
@@ -331,11 +311,7 @@
                             t
 
 tyBang :: Type -> Type
-#if MIN_VERSION_haskell_src_exts(1,18,0)
 tyBang = Syntax.TyBang () (Syntax.BangedTy ()) (Syntax.NoUnpackPragma ())
-#else
-tyBang = Syntax.TyBang () (Syntax.BangedTy ())
-#endif
 
 -- | Application of a Haskell type or expression to an argument.
 -- For example, to represent @f x y@, you can write
