From 10aec170052c25845918986a2df61b5a7acfcad5 Mon Sep 17 00:00:00 2001
From: jneira <atreyu.bbb@gmail.com>
Date: Wed, 13 May 2020 10:44:11 +0200
Subject: [PATCH 01/13] Use allow-newer to build not updated pkgs

---
 cabal.project | 7 +++++++
 1 file changed, 7 insertions(+)
 create mode 100644 cabal.project

diff --git a/cabal.project b/cabal.project
new file mode 100644
index 0000000..051d727
--- /dev/null
+++ b/cabal.project
@@ -0,0 +1,7 @@
+packages: .
+
+allow-newer: multistate:base,
+             data-tree-print:base,
+             czipwith:base,
+             czipwith:template-haskell,
+             butcher:base

From 17d07edb0a687053fbeb39e0bdf07415ee35a278 Mon Sep 17 00:00:00 2001
From: jneira <atreyu.bbb@gmail.com>
Date: Wed, 13 May 2020 10:44:37 +0200
Subject: [PATCH 02/13] Relax upper bounds to include updated packages

---
 brittany.cabal | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/brittany.cabal b/brittany.cabal
index 818e818..590373f 100644
--- a/brittany.cabal
+++ b/brittany.cabal
@@ -91,10 +91,10 @@ library {
     -fno-warn-redundant-constraints
   }
   build-depends:
-    { base >=4.9 && <4.14
-    , ghc >=8.0.1 && <8.9
+    { base >=4.9 && <4.15
+    , ghc >=8.0.1 && <8.11
     , ghc-paths >=0.1.0.9 && <0.2
-    , ghc-exactprint >=0.5.8 && <0.6.3
+    , ghc-exactprint >=0.5.8 && <0.6.4
     , transformers >=0.5.2.0 && <0.6
     , containers >=0.5.7.1 && <0.7
     , mtl >=2.2.1 && <2.3
@@ -118,7 +118,7 @@ library {
     , semigroups >=0.18.2 && <0.20
     , cmdargs >=0.10.14 && <0.11
     , czipwith >=1.0.1.0 && <1.1
-    , ghc-boot-th >=8.0.1 && <8.9
+    , ghc-boot-th >=8.0.1 && <8.11
     , filepath >=1.4.1.0 && <1.5
     , random >= 1.1 && <1.2
     }

From b69a8f983c070564b41b6fdec160af6d8aff730b Mon Sep 17 00:00:00 2001
From: jneira <atreyu.bbb@gmail.com>
Date: Wed, 13 May 2020 10:45:14 +0200
Subject: [PATCH 03/13] Adapt to new GHC modules organization

---
 .../Haskell/Brittany/Internal/ExactPrintUtils.hs  |  6 ++++++
 src/Language/Haskell/Brittany/Internal/Prelude.hs |  8 ++++++--
 src/Language/Haskell/Brittany/Internal/Utils.hs   | 15 ++++++++++++---
 3 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
index 0273d85..5dcf840 100644
--- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
+++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
@@ -33,7 +33,13 @@ import qualified Lexer         as GHC
 import qualified StringBuffer  as GHC
 import qualified Outputable    as GHC
 import qualified CmdLineParser as GHC
+
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+#else
 import           HsSyn
+#endif
+
 import           SrcLoc ( SrcSpan, Located )
 
 
diff --git a/src/Language/Haskell/Brittany/Internal/Prelude.hs b/src/Language/Haskell/Brittany/Internal/Prelude.hs
index 453f076..a0757d8 100644
--- a/src/Language/Haskell/Brittany/Internal/Prelude.hs
+++ b/src/Language/Haskell/Brittany/Internal/Prelude.hs
@@ -13,9 +13,13 @@ where
 
 -- rather project-specific stuff:
 ---------------------------------
-#if MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
+#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */
+import GHC.Hs.Extension               as E ( GhcPs )
+#else
+#  if MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
 import HsExtension                    as E ( GhcPs )
-#endif
+#  endif /* ghc-8.4 */
+#endif /* ghc-8.10.1 */
 
 import RdrName                        as E ( RdrName )
 #if MIN_VERSION_ghc(8,8,0)
diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs
index 435ad96..9edcb7e 100644
--- a/src/Language/Haskell/Brittany/Internal/Utils.hs
+++ b/src/Language/Haskell/Brittany/Internal/Utils.hs
@@ -59,9 +59,13 @@ import           Language.Haskell.Brittany.Internal.Config.Types
 import           Language.Haskell.Brittany.Internal.Types
 
 import qualified Data.Generics.Uniplate.Direct as Uniplate
-#if MIN_VERSION_ghc(8,4,0)   /* ghc-8.4 */
+#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */
+import qualified GHC.Hs.Extension as HsExtension
+#else
+#  if MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
 import qualified HsExtension
-#endif
+#  endif /* ghc-8.4 */
+#endif /* ghc-8.10.1 */
 
 
 
@@ -299,6 +303,10 @@ lines' s = case break (== '\n') s of
   (s1, [_]) -> [s1, ""]
   (s1, (_:r)) -> s1 : lines' r
 
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+absurdExt :: HsExtension.NoExtField -> a
+absurdExt = error "cannot construct NoExtField"
+#else
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 -- | A method to dismiss NoExt patterns for total matches
 absurdExt :: HsExtension.NoExt -> a
@@ -306,4 +314,5 @@ absurdExt = error "cannot construct NoExt"
 #else
 absurdExt :: ()
 absurdExt = ()
-#endif
+#endif   /* ghc-8.6 */
+#endif   /* ghc-8.10.1 */

From 9913b45086efba5164adf4532b7b7816f1839c16 Mon Sep 17 00:00:00 2001
From: Javier Neira <atreyu.bbb@gmail.com>
Date: Thu, 6 Aug 2020 12:24:48 +0200
Subject: [PATCH 04/13] Update cabal.project

Only data-tree-print is needed now

Co-authored-by: Luke Lau <luke_lau@icloud.com>
---
 cabal.project | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/cabal.project b/cabal.project
index 051d727..3e5665f 100644
--- a/cabal.project
+++ b/cabal.project
@@ -1,7 +1,3 @@
 packages: .
 
-allow-newer: multistate:base,
-             data-tree-print:base,
-             czipwith:base,
-             czipwith:template-haskell,
-             butcher:base
+allow-newer: data-tree-print:base

From adb642353d6c3166eea4f52dc3ba83382dcaef04 Mon Sep 17 00:00:00 2001
From: Ximin Luo <infinity0@pwned.gg>
Date: Fri, 29 May 2020 23:26:51 +0100
Subject: [PATCH 05/13] more GHC 8.10.1 fixes

---
 src/Language/Haskell/Brittany/Internal.hs     |  9 +++++++
 .../Brittany/Internal/ExactPrintUtils.hs      | 11 +++++++-
 .../Brittany/Internal/Layouters/DataDecl.hs   |  4 +++
 .../Brittany/Internal/Layouters/Decl.hs       | 15 ++++++++---
 .../Brittany/Internal/Layouters/Expr.hs       | 25 ++++++++++++++++++-
 .../Brittany/Internal/Layouters/Expr.hs-boot  |  4 +++
 .../Haskell/Brittany/Internal/Layouters/IE.hs |  7 +++++-
 .../Brittany/Internal/Layouters/Import.hs     | 12 +++++++++
 .../Brittany/Internal/Layouters/Module.hs     |  7 +++++-
 .../Brittany/Internal/Layouters/Pattern.hs    | 12 +++++++++
 .../Brittany/Internal/Layouters/Stmt.hs       |  4 +++
 .../Brittany/Internal/Layouters/Stmt.hs-boot  |  4 +++
 .../Brittany/Internal/Layouters/Type.hs       | 12 +++++++--
 .../Haskell/Brittany/Internal/Utils.hs        | 10 +++-----
 14 files changed, 121 insertions(+), 15 deletions(-)

diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs
index 1d9266f..1fc3e12 100644
--- a/src/Language/Haskell/Brittany/Internal.hs
+++ b/src/Language/Haskell/Brittany/Internal.hs
@@ -61,7 +61,12 @@ import           GHC                                      ( Located
                                                           )
 import           RdrName                                  ( RdrName(..) )
 import           SrcLoc                                   ( SrcSpan )
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+import           Bag
+#else
 import           HsSyn
+#endif
 import qualified DynFlags                                as GHC
 import qualified GHC.LanguageExtensions.Type             as GHC
 
@@ -380,7 +385,11 @@ parsePrintModuleTests conf filename input = do
   let inputStr = Text.unpack input
   parseResult <- ExactPrint.Parsers.parseModuleFromString filename inputStr
   case parseResult of
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+    Left  err                  -> return $ Left $ "parsing error: " ++ show (bagToList (show <$> err))
+#else
     Left  (_   , s           ) -> return $ Left $ "parsing error: " ++ s
+#endif
     Right (anns, parsedModule) -> runExceptT $ do
       (inlineConf, perItemConf) <-
         case extractCommentConfigs anns (getTopLevelDeclNameMap parsedModule) of
diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
index 5dcf840..6115f52 100644
--- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
+++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
@@ -36,6 +36,7 @@ import qualified CmdLineParser as GHC
 
 #if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
 import           GHC.Hs
+import           Bag
 #else
 import           HsSyn
 #endif
@@ -96,7 +97,11 @@ parseModuleWithCpp cpp opts args fp dynCheck =
       ++ show (warnings <&> warnExtractorCompat)
     x   <- ExceptT.ExceptT $ liftIO $ dynCheck dflags2
     res <- lift $ ExactPrint.parseModuleApiAnnsWithCppInternal cpp dflags2 fp
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+    either (\err -> ExceptT.throwE $ "transform error: " ++ show (bagToList (show <$> err)))
+#else
     either (\(span, err) -> ExceptT.throwE $ show span ++ ": " ++ err)
+#endif
            (\(a, m) -> pure (a, m, x))
       $ ExactPrint.postParseTransform res opts
 
@@ -129,7 +134,11 @@ parseModuleFromString args fp dynCheck str =
     dynCheckRes <- ExceptT.ExceptT $ liftIO $ dynCheck dflags1
     let res = ExactPrint.parseModuleFromStringInternal dflags1 fp str
     case res of
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+      Left  err -> ExceptT.throwE $ "parse error: " ++ show (bagToList (show <$> err))
+#else
       Left  (span, err) -> ExceptT.throwE $ showOutputable span ++ ": " ++ err
+#endif
       Right (a   , m  ) -> pure (a, m, dynCheckRes)
 
 
@@ -193,7 +202,7 @@ commentAnnFixTransformGlob ast = do
                        , ExactPrint.annsDP               = assocs'
                        }
       ExactPrint.modifyAnnsT $ \anns -> Map.insert annKey1 ann1' anns
-  
+
 
 
 commentAnnFixTransform :: GHC.ParsedSource -> ExactPrint.Transform ()
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs
index 00453b3..4d2b93a 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs
@@ -19,7 +19,11 @@ import           Language.Haskell.Brittany.Internal.Config.Types
 import           RdrName ( RdrName(..) )
 import           GHC ( Located, runGhc, GenLocated(L), moduleNameString )
 import qualified GHC
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+#else
 import           HsSyn
+#endif
 import           Name
 import           BasicTypes
 import           Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey )
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
index f33b511..8ec8d74 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
@@ -37,8 +37,10 @@ import           GHC                            ( runGhc
                                                 )
 import           SrcLoc ( SrcSpan, noSrcSpan, Located , getLoc, unLoc )
 import qualified FastString
-import           HsSyn
-#if MIN_VERSION_ghc(8,6,0)
+#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */
+import           GHC.Hs
+import           GHC.Hs.Extension (NoExtField (..))
+#elif MIN_VERSION_ghc(8,6,0)
 import           HsExtension (NoExt (..))
 #endif
 import           Name
@@ -1040,7 +1042,14 @@ layoutClsInst lcid@(L _ cid) = docLines
   ]
  where
   layoutInstanceHead :: ToBriDocM BriDocNumbered
-#if MIN_VERSION_ghc(8,6,0)    /* 8.6 */
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+  layoutInstanceHead =
+    briDocByExactNoComment
+      $   InstD NoExtField
+      .   ClsInstD NoExtField
+      .   removeChildren
+      <$> lcid
+#elif MIN_VERSION_ghc(8,6,0)    /* 8.6 */
   layoutInstanceHead =
     briDocByExactNoComment
       $   InstD NoExt
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
index 660355c..d7c9a2b 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
@@ -19,7 +19,11 @@ import           Language.Haskell.Brittany.Internal.Config.Types
 import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types
 
 import           GHC ( runGhc, GenLocated(L), SrcSpan, moduleNameString, AnnKeywordId(..), RdrName(..) )
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+#else
 import           HsSyn
+#endif
 import           Name
 import qualified FastString
 import           BasicTypes
@@ -521,7 +525,12 @@ layoutExpr lexpr@(L _ expr) = do
 #else
     ExplicitTuple args boxity -> do
 #endif
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+      let argExprs = args <&> \arg -> case arg of
+            (L _ (Present _ e)) -> (arg, Just e);
+            (L _ (Missing NoExtField)) -> (arg, Nothing)
+            (L _ XTupArg{}) -> error "brittany internal error: XTupArg"
+#elif MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
       let argExprs = args <&> \arg -> case arg of
             (L _ (Present _ e)) -> (arg, Just e);
             (L _ (Missing NoExt)) -> (arg, Nothing)
@@ -984,10 +993,18 @@ layoutExpr lexpr@(L _ expr) = do
                 else Just <$> docSharedWrapper layoutExpr rFExpr
               return $ (lfield, lrdrNameToText lnameF, rFExpDoc)
           recordExpression False indentPolicy lexpr nameDoc rFs
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+        HsRecFields [] (Just (L _ 0)) -> do
+#else
         HsRecFields [] (Just 0) -> do
+#endif
           let t = lrdrNameToText lname
           docWrapNode lname $ docLit $ t <> Text.pack " { .. }"
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+        HsRecFields fs@(_:_) (Just (L _ dotdoti)) | dotdoti == length fs -> do
+#else
         HsRecFields fs@(_:_) (Just dotdoti) | dotdoti == length fs -> do
+#endif
           let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname
           fieldDocs <- fs `forM` \fieldl@(L _ (HsRecField (L _ fieldOcc) fExpr pun)) -> do
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
@@ -1137,12 +1154,15 @@ layoutExpr lexpr@(L _ expr) = do
     HsStatic{} -> do
       -- TODO
       briDocByExactInlineOnly "HsStatic{}" lexpr
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+#else
     HsArrApp{} -> do
       -- TODO
       briDocByExactInlineOnly "HsArrApp{}" lexpr
     HsArrForm{} -> do
       -- TODO
       briDocByExactInlineOnly "HsArrForm{}" lexpr
+#endif
     HsTick{} -> do
       -- TODO
       briDocByExactInlineOnly "HsTick{}" lexpr
@@ -1152,6 +1172,8 @@ layoutExpr lexpr@(L _ expr) = do
     HsTickPragma{} -> do
       -- TODO
       briDocByExactInlineOnly "HsTickPragma{}" lexpr
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+#else
     EWildPat{} -> do
       docLit $ Text.pack "_"
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
@@ -1169,6 +1191,7 @@ layoutExpr lexpr@(L _ expr) = do
     ELazyPat{} -> do
       -- TODO
       briDocByExactInlineOnly "ELazyPat{}" lexpr
+#endif
     HsWrap{} -> do
       -- TODO
       briDocByExactInlineOnly "HsWrap{}" lexpr
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot
index 1f76032..733ac90 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot
@@ -15,7 +15,11 @@ import           Language.Haskell.Brittany.Internal.Types
 import           Language.Haskell.Brittany.Internal.LayouterBasics
 
 import           GHC ( runGhc, GenLocated(L), moduleNameString )
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+#else
 import           HsSyn
+#endif
 import           Name
 
 
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
index f2c36de..bfe2679 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
@@ -18,9 +18,14 @@ import           GHC     ( unLoc
                          , AnnKeywordId(..)
                          , Located
                          )
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+import           GHC.Hs.ImpExp
+#else
 import           HsSyn
-import           Name
 import           HsImpExp
+#endif
+import           Name
 import           FieldLabel
 import qualified FastString
 import           BasicTypes
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs
index bcce106..d5bf0dd 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs
@@ -12,7 +12,11 @@ import           GHC                                      ( unLoc
                                                           , moduleNameString
                                                           , Located
                                                           )
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+#else
 import           HsSyn
+#endif
 import           Name
 import           FieldLabel
 import qualified FastString
@@ -59,7 +63,11 @@ layoutImport limportD@(L _ importD) = docWrapNode limportD $ case importD of
       hiding   = maybe False fst mllies
       minQLength = length "import qualified "
       qLengthReal =
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+        let qualifiedPart = if q /= NotQualified then length "qualified " else 0
+#else
         let qualifiedPart = if q then length "qualified " else 0
+#endif
             safePart      = if safe then length "safe " else 0
             pkgPart       = maybe 0 ((+ 1) . Text.length) pkgNameT
             srcPart       = if src then length "{-# SOURCE #-} " else 0
@@ -73,7 +81,11 @@ layoutImport limportD@(L _ importD) = docWrapNode limportD $ case importD of
         [ appSep $ docLit $ Text.pack "import"
         , if src then appSep $ docLit $ Text.pack "{-# SOURCE #-}" else docEmpty
         , if safe then appSep $ docLit $ Text.pack "safe" else docEmpty
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+        , if q /= NotQualified then appSep $ docLit $ Text.pack "qualified" else docEmpty
+#else
         , if q then appSep $ docLit $ Text.pack "qualified" else docEmpty
+#endif
         , maybe docEmpty (appSep . docLit) pkgNameT
         ]
       indentName =
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs
index f899e08..3839ecd 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs
@@ -9,9 +9,14 @@ import           Language.Haskell.Brittany.Internal.Layouters.Import
 import           Language.Haskell.Brittany.Internal.Config.Types
 
 import GHC (unLoc, runGhc, GenLocated(L), moduleNameString, AnnKeywordId(..))
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+import           GHC.Hs.ImpExp
+#else
 import           HsSyn
-import           Name
 import           HsImpExp
+#endif
+import           Name
 import           FieldLabel
 import qualified FastString
 import           BasicTypes
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
index cd1b31e..de943b7 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
@@ -21,7 +21,11 @@ import           GHC                            ( Located
                                                 , ol_val
                                                 )
 import qualified GHC
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+#else
 import           HsSyn
+#endif
 import           Name
 import           BasicTypes
 
@@ -136,14 +140,22 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
       , docSeparator
       , docLit $ Text.pack "}"
       ]
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+  ConPatIn lname (RecCon (HsRecFields [] (Just (L _ 0)))) -> do
+#else
   ConPatIn lname (RecCon (HsRecFields [] (Just 0))) -> do
+#endif
     -- Abc { .. } -> expr
     let t = lrdrNameToText lname
     Seq.singleton <$> docSeq
       [ appSep $ docLit t
       , docLit $ Text.pack "{..}"
       ]
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+  ConPatIn lname (RecCon (HsRecFields fs@(_:_) (Just (L _ dotdoti)))) | dotdoti == length fs -> do
+#else
   ConPatIn lname (RecCon (HsRecFields fs@(_:_) (Just dotdoti))) | dotdoti == length fs -> do
+#endif
     -- Abc { a = locA, .. }
     let t = lrdrNameToText lname
     fds <- fs `forM` \(L _ (HsRecField (L _ fieldOcc) fPat pun)) -> do
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs
index 3aa3b5c..60ba54b 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs
@@ -17,7 +17,11 @@ import           GHC                            ( runGhc
                                                 , GenLocated(L)
                                                 , moduleNameString
                                                 )
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+#else
 import           HsSyn
+#endif
 import           Name
 import qualified FastString
 import           BasicTypes
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot
index faf583a..1fab3c5 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot
@@ -13,7 +13,11 @@ import           Language.Haskell.Brittany.Internal.Types
 import           Language.Haskell.Brittany.Internal.LayouterBasics
 
 import           GHC ( runGhc, GenLocated(L), moduleNameString )
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+#else
 import           HsSyn
+#endif
 import           Name
 import qualified FastString
 import           BasicTypes
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
index 940eac7..7a1fee4 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
@@ -25,7 +25,11 @@ import           GHC ( runGhc
                      , AnnKeywordId (..)
                      )
 import           Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey )
+#if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
+import           GHC.Hs
+#else
 import           HsSyn
+#endif
 import           Name
 import           Outputable ( ftext, showSDocUnsafe )
 import           BasicTypes
@@ -61,7 +65,9 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
     t <- lrdrNameToTextAnnTypeEqualityIsSpecial name
     docWrapNode name $ docLit t
 #endif
-#if MIN_VERSION_ghc(8,6,0)
+#if MIN_VERSION_ghc(8,10,1)
+  HsForAllTy _ _ bndrs (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do
+#elif MIN_VERSION_ghc(8,6,0)
   HsForAllTy _ bndrs (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do
 #else
   HsForAllTy bndrs (L _ (HsQualTy (L _ cntxts) typ2)) -> do
@@ -151,7 +157,9 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
             ]
           )
       ]
-#if MIN_VERSION_ghc(8,6,0)
+#if MIN_VERSION_ghc(8,10,1)
+  HsForAllTy _ _ bndrs typ2 -> do
+#elif MIN_VERSION_ghc(8,6,0)
   HsForAllTy _ bndrs typ2 -> do
 #else
   HsForAllTy bndrs typ2 -> do
diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs
index 9edcb7e..0a0d31f 100644
--- a/src/Language/Haskell/Brittany/Internal/Utils.hs
+++ b/src/Language/Haskell/Brittany/Internal/Utils.hs
@@ -304,15 +304,13 @@ lines' s = case break (== '\n') s of
   (s1, (_:r)) -> s1 : lines' r
 
 #if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
-absurdExt :: HsExtension.NoExtField -> a
-absurdExt = error "cannot construct NoExtField"
-#else
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
+absurdExt :: HsExtension.NoExtCon -> a
+absurdExt = HsExtension.noExtCon
+#elif MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 -- | A method to dismiss NoExt patterns for total matches
 absurdExt :: HsExtension.NoExt -> a
 absurdExt = error "cannot construct NoExt"
 #else
 absurdExt :: ()
 absurdExt = ()
-#endif   /* ghc-8.6 */
-#endif   /* ghc-8.10.1 */
+#endif

From 1e118a44ca9880b5e96f85a6f8c12d756f08fa8b Mon Sep 17 00:00:00 2001
From: Luke Lau <luke_lau@icloud.com>
Date: Thu, 6 Aug 2020 18:50:10 +0100
Subject: [PATCH 06/13] Fix build on GHC 8.8 and below

---
 src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
index 8ec8d74..e512b9a 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
@@ -41,6 +41,7 @@ import qualified FastString
 import           GHC.Hs
 import           GHC.Hs.Extension (NoExtField (..))
 #elif MIN_VERSION_ghc(8,6,0)
+import           HsSyn
 import           HsExtension (NoExt (..))
 #endif
 import           Name

From cf3bc5daf46220b609a7ffac6cd26a717c62edb7 Mon Sep 17 00:00:00 2001
From: Taylor Fausak <taylor@fausak.me>
Date: Wed, 28 Oct 2020 08:45:29 -0400
Subject: [PATCH 07/13] Allow strict 0.4

---
 brittany.cabal | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/brittany.cabal b/brittany.cabal
index 590373f..704d505 100644
--- a/brittany.cabal
+++ b/brittany.cabal
@@ -110,7 +110,7 @@ library {
     , aeson >=1.0.1.0 && <1.6
     , extra >=1.4.10 && <1.8
     , uniplate >=1.6.12 && <1.7
-    , strict >=0.3.2 && <0.4
+    , strict >=0.3.2 && <0.5
     , monad-memo >=0.4.1 && <0.6
     , unsafe >=0.0 && <0.1
     , safe >=0.3.9 && <0.4

From 045c387ff4ec8ce60c976d9eaafb36088b135ede Mon Sep 17 00:00:00 2001
From: Taylor Fausak <taylor@fausak.me>
Date: Sun, 15 Nov 2020 10:11:24 -0500
Subject: [PATCH 08/13] Remove unnecessary configuration

The latest revision of data-tree-print allows base 4.14.
---
 cabal.project | 3 ---
 1 file changed, 3 deletions(-)
 delete mode 100644 cabal.project

diff --git a/cabal.project b/cabal.project
deleted file mode 100644
index 3e5665f..0000000
--- a/cabal.project
+++ /dev/null
@@ -1,3 +0,0 @@
-packages: .
-
-allow-newer: data-tree-print:base

From 23dace16ed4404baaed6bf1e0b3af458dc25af2a Mon Sep 17 00:00:00 2001
From: Taylor Fausak <taylor@fausak.me>
Date: Sun, 15 Nov 2020 10:28:36 -0500
Subject: [PATCH 09/13] Don't fail fast

---
 .github/workflows/ci.yaml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 2ebc7b5..e79c8d1 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -9,6 +9,7 @@ on:
 jobs:
   build:
     strategy:
+      fail-fast: false
       matrix:
         os:
           - macos-10.15

From 096c438b2351288cbf237da652bad1ceca1d8cdb Mon Sep 17 00:00:00 2001
From: Taylor Fausak <taylor@fausak.me>
Date: Sun, 15 Nov 2020 11:10:06 -0500
Subject: [PATCH 10/13] Drop support for GHC 8.0

---
 .github/workflows/ci.yaml                     |  3 --
 .travis.yml                                   | 12 ++---
 Makefile                                      |  7 +--
 README.md                                     | 10 ++--
 brittany.cabal                                |  6 +--
 .../Haskell/Brittany/Internal/Config/Types.hs |  4 --
 .../Brittany/Internal/ExactPrintUtils.hs      |  2 +-
 .../Brittany/Internal/Layouters/DataDecl.hs   | 26 +--------
 .../Brittany/Internal/Layouters/Decl.hs       | 46 ++++------------
 .../Brittany/Internal/Layouters/Expr.hs       | 54 ++++---------------
 .../Brittany/Internal/Layouters/Expr.hs-boot  |  2 +-
 .../Haskell/Brittany/Internal/Layouters/IE.hs | 16 ------
 .../Brittany/Internal/Layouters/Import.hs     | 10 ----
 .../Brittany/Internal/Layouters/Pattern.hs    | 15 ++----
 .../Brittany/Internal/Layouters/Type.hs       | 21 +-------
 .../Haskell/Brittany/Internal/Prelude.hs      |  6 +--
 .../Haskell/Brittany/Internal/Types.hs        |  2 -
 stack-8.0.2.yaml                              | 12 -----
 stack-8.0.2.yaml.lock                         | 54 -------------------
 19 files changed, 43 insertions(+), 265 deletions(-)
 delete mode 100644 stack-8.0.2.yaml
 delete mode 100644 stack-8.0.2.yaml.lock

diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index e79c8d1..7ad0476 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -29,9 +29,6 @@ jobs:
           - os: ubuntu-18.04
             ghc: 8.2.2
             cabal: 3.2.0.0
-          - os: ubuntu-18.04
-            ghc: 8.0.2
-            cabal: 3.2.0.0
     runs-on: ${{ matrix.os }}
     steps:
       - uses: actions/checkout@v2
diff --git a/.travis.yml b/.travis.yml
index ae64c83..cd70c46 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -40,7 +40,7 @@ before_cache:
 #     addons: {apt: {packages: [libfcgi-dev,libgmp-dev]}}
 matrix:
   include:
-  
+
   ##### OSX test via stack #####
 
   # Build on macOS in addition to Linux
@@ -49,10 +49,7 @@ matrix:
     os: osx
 
   ##### CABAL #####
-  
-  - env: BUILD=cabal GHCVER=8.0.2 CABALVER=1.24 HAPPYVER=1.19.5 ALEXVER=3.1.7
-    compiler: ": #cabal 8.0.2"
-    addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.2,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
+
   - env: BUILD=cabal GHCVER=8.2.2 CABALVER=1.24 HAPPYVER=1.19.5 ALEXVER=3.1.7
     compiler: ": #cabal 8.2.2"
     addons: {apt: {packages: [cabal-install-1.24,ghc-8.2.2,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
@@ -92,9 +89,6 @@ matrix:
     compiler: ": #stack default"
     addons: {apt: {packages: [libgmp-dev]}}
 
-  - env: BUILD=stack ARGS="--stack-yaml stack-8.0.2.yaml"
-    compiler: ": #stack 8.0.2"
-    addons: {apt: {packages: [libgmp-dev]}}
   - env: BUILD=stack ARGS="--stack-yaml stack-8.2.2.yaml"
     compiler: ": #stack 8.2.2"
     addons: {apt: {packages: [libgmp-dev]}}
@@ -202,7 +196,7 @@ install:
         mkdir -p $HOME/.ghc $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin;
         cabal install -j$JOBS --only-dependencies --enable-tests --enable-benchmarks --ghc-options="-j1 +RTS -M700M -RTS";
       fi
-      
+
       # snapshot package-db on cache miss
       if [ ! -d $HOME/.cabsnap ];
       then
diff --git a/Makefile b/Makefile
index e0213ab..c7524be 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ test:
 
 .PHONY: test-all
 test-all:
-	$(MAKE) test test-8.6.5 test-8.4.3 test-8.2.2 test-8.0.2
+	$(MAKE) test test-8.6.5 test-8.4.3 test-8.2.2
 
 .PHONY: test-8.6.5
 test-8.6.5:
@@ -21,8 +21,3 @@ test-8.4.3:
 test-8.2.2:
 	echo "test 8.2.2"
 	stack test --stack-yaml stack-8.2.2.yaml --work-dir .stack-work-8.2.2
-
-.PHONY: test-8.0.2
-test-8.0.2:
-	echo "test 8.0.2"
-	stack test --stack-yaml stack-8.0.2.yaml --work-dir .stack-work-8.0.2
diff --git a/README.md b/README.md
index 6fe5976..b009a37 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# brittany [![Hackage version](https://img.shields.io/hackage/v/brittany.svg?label=Hackage)](https://hackage.haskell.org/package/brittany) [![Stackage version](https://www.stackage.org/package/brittany/badge/lts?label=Stackage)](https://www.stackage.org/package/brittany) [![Build Status](https://secure.travis-ci.org/lspitzner/brittany.svg?branch=master)](http://travis-ci.org/lspitzner/brittany) 
+# brittany [![Hackage version](https://img.shields.io/hackage/v/brittany.svg?label=Hackage)](https://hackage.haskell.org/package/brittany) [![Stackage version](https://www.stackage.org/package/brittany/badge/lts?label=Stackage)](https://www.stackage.org/package/brittany) [![Build Status](https://secure.travis-ci.org/lspitzner/brittany.svg?branch=master)](http://travis-ci.org/lspitzner/brittany)
 haskell source code formatter
 
 ![Output sample](https://github.com/lspitzner/brittany/raw/master/brittany-sample.gif)
@@ -31,7 +31,7 @@ require fixing:
   other module elements (data-decls, classes, instances, etc.)
   are not transformed in any way; this extends to e.g. **bindings inside class
   instance definitions** - they **won't be touched** (yet).
-- By using `ghc-exactprint` as the parser, brittany supports full GHC 
+- By using `ghc-exactprint` as the parser, brittany supports full GHC
   including extensions, but **some of the less common syntactic elements
   (even of 2010 haskell) are not handled**.
 - **There are some known issues regarding handling of in-source comments.**
@@ -48,7 +48,7 @@ log the size of the input, but _not_ the full input/output of requests.)
 
 # Other usage notes
 
-- Supports GHC versions `8.0`, `8.2`, `8.4`, `8.6`, `8.8`.
+- Supports GHC versions `8.2`, `8.4`, `8.6`, `8.8`.
 - included in stackage with lts>=10.0 (or nightlies dating to >=2017-11-15)
 - config (file) documentation is lacking.
 - some config values can not be configured via commandline yet.
@@ -127,13 +127,13 @@ log the size of the input, but _not_ the full input/output of requests.)
 - Default mode of operation: Transform a single module, from `stdin` to `stdout`.
   Can pass one or multiple files as input, and there is a flag to override them
   in place instead of using `stdout` (since 0.9.0.0). So:
-  
+
     ~~~~ .sh
     brittany                           # stdin -> stdout
     brittany mysource.hs               # ./mysource.hs -> stdout
     brittany --write-mode=inplace *.hs # apply formatting to all ./*.hs inplace
     ~~~~
-    
+
 - For stdin/stdout usage it makes sense to enable certain syntactic extensions
   by default, i.e. to add something like this to your
   `~/.config/brittany/config.yaml` (execute `brittany` once to create default):
diff --git a/brittany.cabal b/brittany.cabal
index 704d505..0c3ed7c 100644
--- a/brittany.cabal
+++ b/brittany.cabal
@@ -91,8 +91,8 @@ library {
     -fno-warn-redundant-constraints
   }
   build-depends:
-    { base >=4.9 && <4.15
-    , ghc >=8.0.1 && <8.11
+    { base >=4.10 && <4.15
+    , ghc >=8.2.1 && <8.11
     , ghc-paths >=0.1.0.9 && <0.2
     , ghc-exactprint >=0.5.8 && <0.6.4
     , transformers >=0.5.2.0 && <0.6
@@ -118,7 +118,7 @@ library {
     , semigroups >=0.18.2 && <0.20
     , cmdargs >=0.10.14 && <0.11
     , czipwith >=1.0.1.0 && <1.1
-    , ghc-boot-th >=8.0.1 && <8.11
+    , ghc-boot-th >=8.2.1 && <8.11
     , filepath >=1.4.1.0 && <1.5
     , random >= 1.1 && <1.2
     }
diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/src/Language/Haskell/Brittany/Internal/Config/Types.hs
index 32da0ac..c5d8eb0 100644
--- a/src/Language/Haskell/Brittany/Internal/Config/Types.hs
+++ b/src/Language/Haskell/Brittany/Internal/Config/Types.hs
@@ -229,15 +229,12 @@ deriving instance Data (CForwardOptions Identity)
 deriving instance Data (CPreProcessorConfig Identity)
 deriving instance Data (CConfig Identity)
 
-#if MIN_VERSION_ghc(8,2,0)
--- these instances break on earlier ghcs
 deriving instance Data (CDebugConfig Option)
 deriving instance Data (CLayoutConfig Option)
 deriving instance Data (CErrorHandlingConfig Option)
 deriving instance Data (CForwardOptions Option)
 deriving instance Data (CPreProcessorConfig Option)
 deriving instance Data (CConfig Option)
-#endif
 
 instance Semigroup.Semigroup (CDebugConfig Option) where
   (<>) = gmappend
@@ -356,4 +353,3 @@ deriveCZipWith ''CErrorHandlingConfig
 deriveCZipWith ''CForwardOptions
 deriveCZipWith ''CPreProcessorConfig
 deriveCZipWith ''CConfig
-
diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
index 6115f52..7c06f69 100644
--- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
+++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
@@ -323,7 +323,7 @@ withTransformedAnns ast m = MultiRWSS.mGetRawR >>= \case
 #if MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
 warnExtractorCompat :: GHC.Warn -> String
 warnExtractorCompat (GHC.Warn _ (L _ s)) = s
-#else /* ghc-8.0 && ghc-8.2 */
+#else /* ghc-8.2 */
 warnExtractorCompat :: GenLocated l String -> String
 warnExtractorCompat (L _ s) = s
 #endif
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs
index 4d2b93a..74b6d53 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs
@@ -297,7 +297,6 @@ createDerivingPar
   :: HsDeriving GhcPs -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered
 createDerivingPar derivs mainDoc = do
   case derivs of
-#if MIN_VERSION_ghc(8,2,0)   /* ghc-8.2 */
     (L _ []) -> mainDoc
     (L _ types) ->
       docPar mainDoc
@@ -306,26 +305,13 @@ createDerivingPar derivs mainDoc = do
         $   docWrapNode derivs
         $   derivingClauseDoc
         <$> types
-#else
-    Nothing -> mainDoc
-    Just types ->
-      docPar mainDoc
-        $ docEnsureIndent BrIndentRegular
-        $ derivingClauseDoc types
-#endif
 
-#if MIN_VERSION_ghc(8,2,0)   /* ghc-8.2 */
 derivingClauseDoc :: LHsDerivingClause GhcPs -> ToBriDocM BriDocNumbered
-#else
-derivingClauseDoc :: Located [LHsSigType GhcPs] -> ToBriDocM BriDocNumbered
-#endif
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 derivingClauseDoc (L _ (XHsDerivingClause ext)) = absurdExt ext
 derivingClauseDoc (L _ (HsDerivingClause _ext mStrategy types)) = case types of
-#elif MIN_VERSION_ghc(8,2,0)   /* ghc-8.2 */
-derivingClauseDoc (L _ (HsDerivingClause mStrategy types)) = case types of
 #else
-derivingClauseDoc types = case types of
+derivingClauseDoc (L _ (HsDerivingClause mStrategy types)) = case types of
 #endif
   (L _ []) -> docSeq []
   (L _ ts) ->
@@ -333,11 +319,7 @@ derivingClauseDoc types = case types of
       tsLength = length ts
       whenMoreThan1Type val =
         if tsLength > 1 then docLitS val else docLitS ""
-#if MIN_VERSION_ghc(8,2,0)   /* ghc-8.2 */
       (lhsStrategy, rhsStrategy) = maybe (docEmpty, docEmpty) strategyLeftRight mStrategy
-#else
-      (lhsStrategy, rhsStrategy) = (docEmpty, docEmpty)
-#endif
     in
       docSeq
         [ docDeriving
@@ -351,15 +333,12 @@ derivingClauseDoc types = case types of
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
             HsIB _ t -> layoutType t
             XHsImplicitBndrs x -> absurdExt x
-#elif MIN_VERSION_ghc(8,2,0)   /* ghc-8.2 */
-            HsIB _ t _ -> layoutType t
 #else
-            HsIB _ t -> layoutType t
+            HsIB _ t _ -> layoutType t
 #endif
         , whenMoreThan1Type ")"
         , rhsStrategy
         ]
-#if MIN_VERSION_ghc(8,2,0)   /* ghc-8.6 */
  where
   strategyLeftRight = \case
     (L _ StockStrategy          ) -> (docLitS " stock", docEmpty)
@@ -377,7 +356,6 @@ derivingClauseDoc types = case types of
           XHsImplicitBndrs ext -> absurdExt ext
       )
 #endif
-#endif
 
 docDeriving :: ToBriDocM BriDocNumbered
 docDeriving = docLitS "deriving"
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
index e512b9a..4a86954 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
@@ -49,9 +49,7 @@ import           BasicTypes ( InlinePragma(..)
                             , Activation(..)
                             , InlineSpec(..)
                             , RuleMatchInfo(..)
-#if MIN_VERSION_ghc(8,2,0)
                             , LexicalFixity(..)
-#endif
                             )
 import           Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey )
 
@@ -100,10 +98,8 @@ layoutSig :: ToBriDoc Sig
 layoutSig lsig@(L _loc sig) = case sig of
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   TypeSig _ names (HsWC _ (HsIB _ typ)) -> layoutNamesAndType Nothing names typ
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.2 8.4 */
+#else /* ghc-8.2 */
   TypeSig names (HsWC _ (HsIB _ typ _)) -> layoutNamesAndType Nothing names typ
-#else /* ghc-8.0 */
-  TypeSig names (HsIB _ (HsWC _ _ typ)) -> layoutNamesAndType Nothing names typ
 #endif
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   InlineSig _ name (InlinePragma _ spec _arity phaseAct conlike) ->
@@ -128,17 +124,13 @@ layoutSig lsig@(L _loc sig) = case sig of
         <> Text.pack " #-}"
 #if MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
   ClassOpSig _ False names (HsIB _ typ) -> layoutNamesAndType Nothing names typ
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.2 8.4 */
+#else /* ghc-8.2 */
   ClassOpSig False names (HsIB _ typ _) -> layoutNamesAndType Nothing names typ
-#else /* ghc-8.0 */
-  ClassOpSig False names (HsIB _ typ) -> layoutNamesAndType Nothing names typ
 #endif
 #if MIN_VERSION_ghc(8,6,0)
   PatSynSig _ names (HsIB _ typ) -> layoutNamesAndType (Just "pattern") names typ
-#elif MIN_VERSION_ghc(8,2,0)
-  PatSynSig names (HsIB _ typ _) -> layoutNamesAndType (Just "pattern") names typ
 #else
-  PatSynSig name (HsIB _ typ) -> layoutNamesAndType (Just "pattern") [name] typ
+  PatSynSig names (HsIB _ typ _) -> layoutNamesAndType (Just "pattern") names typ
 #endif
   _ -> briDocByExactNoComment lsig -- TODO
  where
@@ -359,10 +351,8 @@ layoutPatternBind funId binderDoc lmatch@(L _ match) = do
     Match _ (FunRhs matchId _ _) _ _ -> Just <$> lrdrNameToTextAnn matchId
 #elif MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
     Match (FunRhs matchId _ _) _ _ -> Just <$> lrdrNameToTextAnn matchId
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.4 */
-    Match (FunRhs matchId _ _) _ _ _ -> Just <$> lrdrNameToTextAnn matchId
 #else
-    Match (FunBindMatch matchId _) _ _ _ -> Just <$> lrdrNameToTextAnn matchId
+    Match (FunRhs matchId _ _) _ _ _ -> Just <$> lrdrNameToTextAnn matchId
 #endif
     _ -> pure Nothing
   let mIdStr' = fixPatternBindIdentifier match <$> mIdStr
@@ -406,7 +396,6 @@ layoutPatternBind funId binderDoc lmatch@(L _ match) = do
                          mWhereArg
                          hasComments
 
-#if MIN_VERSION_ghc(8,2,0) /* ghc-8.2 && ghc-8.4 */
 fixPatternBindIdentifier
   :: Match GhcPs (LHsExpr GhcPs) -> Text -> Text
 fixPatternBindIdentifier match idStr = go $ m_ctxt match
@@ -424,10 +413,6 @@ fixPatternBindIdentifier match idStr = go $ m_ctxt match
     (ParStmtCtxt   ctx1) -> goInner ctx1
     (TransStmtCtxt ctx1) -> goInner ctx1
     _                    -> idStr
-#else                       /* ghc-8.0 */
-fixPatternBindIdentifier :: Match GhcPs (LHsExpr GhcPs) -> Text -> Text
-fixPatternBindIdentifier _ x = x
-#endif
 
 layoutPatternBindFinal
   :: Maybe Text
@@ -842,18 +827,11 @@ layoutTyCl ltycl@(L _loc tycl) = case tycl of
     let isInfix = case fixity of
           Prefix -> False
           Infix  -> True
-#elif MIN_VERSION_ghc(8,2,0)
+#else
   SynDecl name vars fixity typ _ -> do
     let isInfix = case fixity of
           Prefix -> False
           Infix  -> True
-#else
-  SynDecl name vars typ _ -> do
-    nameStr <- lrdrNameToTextAnn name
-    let isInfixTypeOp = case Text.uncons nameStr of
-          Nothing -> False
-          Just (c, _) -> not (c == '(' || isUpper c)
-    isInfix <- (isInfixTypeOp ||) <$> hasAnnKeyword name AnnBackquote
 #endif
     -- hasTrailingParen <- hasAnnKeywordComment ltycl AnnCloseP
     -- let parenWrapper = if hasTrailingParen
@@ -864,10 +842,8 @@ layoutTyCl ltycl@(L _loc tycl) = case tycl of
       $ layoutSynDecl isInfix wrapNodeRest name (hsq_explicit vars) typ
 #if MIN_VERSION_ghc(8,6,0)
   DataDecl _ext name tyVars _ dataDefn ->
-#elif MIN_VERSION_ghc(8,2,0)
-  DataDecl name tyVars _ dataDefn _ _ ->
 #else
-  DataDecl name tyVars dataDefn _ _ ->
+  DataDecl name tyVars _ dataDefn _ _ ->
 #endif
     layoutDataDecl ltycl name tyVars dataDefn
   _ -> briDocByExactNoComment ltycl
@@ -919,14 +895,14 @@ layoutTyVarBndr needsSep lbndr@(L _ bndr) = do
 #if MIN_VERSION_ghc(8,6,0)    /* 8.6 */
     XTyVarBndr{} -> error "brittany internal error: XTyVarBndr"
     UserTyVar _ name -> do
-#else                         /* 8.0 8.2 8.4 */
+#else                         /* 8.2 8.4 */
     UserTyVar name -> do
 #endif
       nameStr <- lrdrNameToTextAnn name
       docSeq $ [docSeparator | needsSep] ++ [docLit nameStr]
 #if MIN_VERSION_ghc(8,6,0)    /* 8.6 */
     KindedTyVar _ name kind -> do
-#else                         /* 8.0 8.2 8.4 */
+#else                         /* 8.2 8.4 */
     KindedTyVar name kind -> do
 #endif
       nameStr <- lrdrNameToTextAnn name
@@ -967,12 +943,8 @@ layoutTyFamInstDecl inClass outerNode tfid = do
     FamEqn name pats _fixity typ = hsib_body $ tfid_eqn tfid
     bndrsMay = Nothing
     innerNode = outerNode
-#elif MIN_VERSION_ghc(8,2,0)
-    innerNode@(L _ (TyFamEqn name boundPats _fixity typ)) = tfid_eqn tfid
-    bndrsMay = Nothing
-    pats = hsib_body boundPats
 #else
-    innerNode@(L _ (TyFamEqn name boundPats typ)) = tfid_eqn tfid
+    innerNode@(L _ (TyFamEqn name boundPats _fixity typ)) = tfid_eqn tfid
     bndrsMay = Nothing
     pats = hsib_body boundPats
 #endif
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
index d7c9a2b..534496d 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
@@ -62,10 +62,8 @@ layoutExpr lexpr@(L _ expr) = do
       briDocByExactInlineOnly "HsRecFld" lexpr
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsOverLabel _ext _reboundFromLabel name ->
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.2 8.4 */
+#else                        /* ghc-8.2 */
     HsOverLabel _reboundFromLabel name ->
-#else                        /* ghc-8.0 */
-    HsOverLabel name ->
 #endif
       let label = FastString.unpackFS name
       in docLit . Text.pack $ '#' : label
@@ -176,19 +174,15 @@ layoutExpr lexpr@(L _ expr) = do
 #endif
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsLamCase _ (MG _ (L _ []) _) -> do
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.2 8.4*/
+#else                        /* ghc-8.2 */
     HsLamCase (MG (L _ []) _ _ _) -> do
-#else                        /* ghc-8.0 */
-    HsLamCase _ (MG (L _ []) _ _ _) -> do
 #endif
       docSetParSpacing $ docAddBaseY BrIndentRegular $
         (docLit $ Text.pack "\\case {}")
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsLamCase _ (MG _ lmatches@(L _ matches) _) -> do
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.2 8.4*/
+#else                        /* ghc-8.2 */
     HsLamCase (MG lmatches@(L _ matches) _ _ _) -> do
-#else                        /* ghc-8.0 */
-    HsLamCase _ (MG lmatches@(L _ matches) _ _ _) -> do
 #endif
       binderDoc   <- docLit $ Text.pack "->"
       funcPatDocs <- docWrapNode lmatches
@@ -311,10 +305,8 @@ layoutExpr lexpr@(L _ expr) = do
     HsAppType XHsWildCardBndrs{} _ ->
       error "brittany internal error: HsAppType XHsWildCardBndrs"
     HsAppType (HsWC _ ty1) exp1 -> do
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.2 8.4 */
+#else                        /* ghc-8.2 */
     HsAppType exp1 (HsWC _ ty1) -> do
-#else                        /* ghc-8.0 */
-    HsAppType exp1 (HsWC _ _ ty1) -> do
 #endif
       t <- docSharedWrapper layoutType ty1
       e <- docSharedWrapper layoutExpr exp1
@@ -329,7 +321,7 @@ layoutExpr lexpr@(L _ expr) = do
             e
             (docSeq [docLit $ Text.pack "@", t ])
         ]
-#if !MIN_VERSION_ghc(8,6,0)   /* ghc-8.0 8.2 8.4 */
+#if !MIN_VERSION_ghc(8,6,0)   /* ghc-8.2 8.4 */
     HsAppTypeOut{} -> do
       -- TODO
       briDocByExactInlineOnly "HsAppTypeOut{}" lexpr
@@ -968,7 +960,7 @@ layoutExpr lexpr@(L _ expr) = do
             in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end]
     ExplicitList _ _ [] ->
       docLit $ Text.pack "[]"
-#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.0 8.2 8.4 */
+#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.2 8.4 */
     ExplicitPArr{} -> do
       -- TODO
       briDocByExactInlineOnly "ExplicitPArr{}" lexpr
@@ -1052,10 +1044,8 @@ layoutExpr lexpr@(L _ expr) = do
     ExprWithTySig XHsWildCardBndrs{} _ ->
       error "brittany internal error: ExprWithTySig XHsWildCardBndrs"
     ExprWithTySig (HsWC _ (HsIB _ typ1)) exp1 -> do
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.2 8,4 */
+#else /* ghc-8.2 */
     ExprWithTySig exp1 (HsWC _ (HsIB _ typ1 _)) -> do
-#else /* ghc-8.0 */
-    ExprWithTySig exp1 (HsIB _ (HsWC _ _ typ1)) -> do
 #endif
       expDoc <- docSharedWrapper layoutExpr exp1
       typDoc <- docSharedWrapper layoutType typ1
@@ -1064,7 +1054,7 @@ layoutExpr lexpr@(L _ expr) = do
         , appSep $ docLit $ Text.pack "::"
         , typDoc
         ]
-#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.0 8.2 8.4 */
+#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.2 8.4 */
     ExprWithTySigOut{} -> do
       -- TODO
       briDocByExactInlineOnly "ExprWithTySigOut{}" lexpr
@@ -1113,7 +1103,7 @@ layoutExpr lexpr@(L _ expr) = do
             ]
     ArithSeq{} ->
       briDocByExactInlineOnly "ArithSeq" lexpr
-#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.0 8.2 8.4 */
+#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.2 8.4 */
     PArrSeq{} -> do
       -- TODO
       briDocByExactInlineOnly "PArrSeq{}" lexpr
@@ -1195,14 +1185,12 @@ layoutExpr lexpr@(L _ expr) = do
     HsWrap{} -> do
       -- TODO
       briDocByExactInlineOnly "HsWrap{}" lexpr
-#if MIN_VERSION_ghc(8,2,0) /* ghc-8.2 */
     HsConLikeOut{} -> do
       -- TODO
       briDocByExactInlineOnly "HsWrap{}" lexpr
     ExplicitSum{} -> do
       -- TODO
       briDocByExactInlineOnly "ExplicitSum{}" lexpr
-#endif
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     XExpr{} -> error "brittany internal error: XExpr"
 #endif
@@ -1367,7 +1355,7 @@ overLitValBriDoc = \case
   HsFractional (FL (SourceText t) _ _) -> BDFLit $ Text.pack t
   HsIsString (SourceText t) _ -> BDFLit $ Text.pack t
   _ -> error "overLitValBriDoc: literal with no SourceText"
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.2 */
+#else                        /* ghc-8.2 */
 litBriDoc :: HsLit -> BriDocFInt
 litBriDoc = \case
   HsChar       (SourceText t) _c          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\'']
@@ -1391,26 +1379,4 @@ overLitValBriDoc = \case
   HsFractional (FL t _) -> BDFLit $ Text.pack t
   HsIsString (SourceText t) _        -> BDFLit $ Text.pack t
   _ -> error "overLitValBriDoc: literal with no SourceText"
-#else                        /* ghc-8.0 */
-litBriDoc :: HsLit -> BriDocFInt
-litBriDoc = \case
-  HsChar       t _c          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\'']
-  HsCharPrim   t _c          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\'']
-  HsString     t _fastString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ FastString.unpackFS fastString
-  HsStringPrim t _byteString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ Data.ByteString.Char8.unpack byteString
-  HsInt        t _i          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsIntPrim    t _i          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsWordPrim   t _i          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsInt64Prim  t _i          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsWord64Prim t _i          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsInteger t _i _type       -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsRat (FL t _) _type       -> BDFLit $ Text.pack t
-  HsFloatPrim  (FL t _)      -> BDFLit $ Text.pack t
-  HsDoublePrim (FL t _)      -> BDFLit $ Text.pack t
-
-overLitValBriDoc :: OverLitVal -> BriDocFInt
-overLitValBriDoc = \case
-  HsIntegral t _        -> BDFLit $ Text.pack t
-  HsFractional (FL t _) -> BDFLit $ Text.pack t
-  HsIsString t _        -> BDFLit $ Text.pack t
 #endif
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot
index 733ac90..606790b 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot
@@ -30,7 +30,7 @@ layoutExpr :: ToBriDoc HsExpr
 
 #if   MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
 litBriDoc :: HsLit GhcPs -> BriDocFInt
-#else /* ghc-8.0 && ghc-8.2 */
+#else /* ghc-8.2 */
 litBriDoc :: HsLit -> BriDocFInt
 #endif
 
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
index bfe2679..739d138 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
@@ -34,13 +34,8 @@ import           Language.Haskell.Brittany.Internal.Utils
 
 
 
-#if MIN_VERSION_ghc(8,2,0)
 prepareName :: LIEWrappedName name -> Located name
 prepareName = ieLWrappedName
-#else
-prepareName :: Located name -> Located name
-prepareName = id
-#endif
 
 layoutIE :: ToBriDoc IE
 layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of
@@ -111,7 +106,6 @@ layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of
     ]
   _ -> docEmpty
  where
-#if MIN_VERSION_ghc(8,2,0) /* ghc-8.2, 8.4, .. */
   layoutWrapped _ = \case
     L _ (IEName    n) -> docLit =<< lrdrNameToTextAnn n
     L _ (IEPattern n) -> do
@@ -120,16 +114,6 @@ layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of
     L _ (IEType n) -> do
       name <- lrdrNameToTextAnn n
       docLit $ Text.pack "type " <> name
-#else                      /* ghc-8.0 */
-  layoutWrapped outer n = do
-    name <- lrdrNameToTextAnn n
-    hasType <- hasAnnKeyword n AnnType
-    hasPattern <- hasAnnKeyword outer AnnPattern
-    docLit $ if
-      | hasType    -> Text.pack "type (" <> name <> Text.pack ")"
-      | hasPattern -> Text.pack "pattern " <> name
-      | otherwise  -> name
-#endif
 
 -- Helper function to deal with Located lists of LIEs.
 -- In particular this will also associate documentation
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs
index d5bf0dd..ac29eda 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs
@@ -26,24 +26,14 @@ import           Language.Haskell.Brittany.Internal.Utils
 
 
 
-#if MIN_VERSION_ghc(8,2,0)
 prepPkg :: SourceText -> String
 prepPkg rawN = case rawN of
   SourceText n -> n
   -- This would be odd to encounter and the
   -- result will most certainly be wrong
   NoSourceText -> ""
-#else
-prepPkg :: String -> String
-prepPkg = id
-#endif
-#if MIN_VERSION_ghc(8,2,0)
 prepModName :: Located e -> e
 prepModName = unLoc
-#else
-prepModName :: e -> e
-prepModName = id
-#endif
 
 layoutImport :: ToBriDoc ImportDecl
 layoutImport limportD@(L _ importD) = docWrapNode limportD $ case importD of
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
index de943b7..b0b13f2 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
@@ -50,14 +50,14 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
     -- _ -> expr
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   VarPat _ n ->
-#else                        /* ghc-8.0 8.2 8.4 */
+#else                        /* ghc-8.2 8.4 */
   VarPat   n ->
 #endif
     fmap Seq.singleton $ docLit $ lrdrNameToText n
     -- abc -> expr
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   LitPat _ lit ->
-#else                        /* ghc-8.0 8.2 8.4 */
+#else                        /* ghc-8.2 8.4 */
   LitPat lit ->
 #endif
     fmap Seq.singleton $ allocateNode $ litBriDoc lit
@@ -66,7 +66,7 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
   ParPat _ inner -> do
 #elif MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
   ParPat _ inner -> do
-#else                        /* ghc-8.0 8.2 8.4 */
+#else                        /* ghc-8.2 8.4 */
   ParPat inner -> do
 #endif
     -- (nestedpat) -> expr
@@ -202,10 +202,8 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
   SigPat _ pat1 (HsWC _ (HsIB _ ty1)) -> do
 #elif MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
   SigPat (HsWC _ (HsIB _ ty1)) pat1 -> do
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.2 8.4 */
+#else                        /* ghc-8.2 */
   SigPatIn pat1 (HsWC _ (HsIB _ ty1 _)) -> do
-#else                        /* ghc-8.0 */
-  SigPatIn pat1 (HsIB _ (HsWC _ _ ty1)) -> do
 #endif
     -- i :: Int -> expr
     patDocs <- layoutPat pat1
@@ -260,11 +258,6 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
       Just{}  -> Seq.fromList [negDoc, litDoc]
       Nothing -> Seq.singleton litDoc
 
--- if MIN_VERSION_ghc(8,0,0)
---   VarPat n -> return $ stringLayouter lpat $ lrdrNameToText n
--- else
---   VarPat n -> return $ stringLayouter lpat $ rdrNameToText n
--- endif
   _ -> return <$> briDocByExactInlineOnly "some unknown pattern" (ghcDL lpat)
 
 colsWrapPat :: Seq BriDocNumbered -> ToBriDocM BriDocNumbered
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
index 7a1fee4..2060904 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
@@ -42,7 +42,6 @@ import           DataTreePrint
 layoutType :: ToBriDoc HsType
 layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
   -- _ | traceShow (ExactPrint.Types.mkAnnKey ltype) False -> error "impossible"
-#if MIN_VERSION_ghc(8,2,0)
 #if MIN_VERSION_ghc(8,6,0)
   HsTyVar _ promoted name -> do
 #else   /* ghc-8.2 ghc-8.4 */
@@ -60,11 +59,6 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
         , docWrapNode name $ docLit t
         ]
       NotPromoted -> docWrapNode name $ docLit t
-#else /* ghc-8.0 */
-  HsTyVar name -> do
-    t <- lrdrNameToTextAnnTypeEqualityIsSpecial name
-    docWrapNode name $ docLit t
-#endif
 #if MIN_VERSION_ghc(8,10,1)
   HsForAllTy _ _ bndrs (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do
 #elif MIN_VERSION_ghc(8,6,0)
@@ -547,10 +541,8 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
   --     }
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   HsIParamTy _ (L _ (HsIPName ipName)) typ1 -> do
-#elif MIN_VERSION_ghc(8,2,0) /* ghc-8.2 8.4 */
+#else                        /* ghc-8.2 */
   HsIParamTy (L _ (HsIPName ipName)) typ1 -> do
-#else                        /* ghc-8.0 */
-  HsIParamTy (HsIPName ipName) typ1 -> do
 #endif
     typeDoc1 <- docSharedWrapper layoutType typ1
     docAlt
@@ -699,11 +691,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
     briDocByExactInlineOnly "HsDocTy{}" ltype
   HsRecTy{} -> -- TODO
     briDocByExactInlineOnly "HsRecTy{}" ltype
-#if MIN_VERSION_ghc(8,2,0) /* ghc-8.2 */
   HsExplicitListTy _ _ typs -> do
-#else /* ghc-8.0 */
-  HsExplicitListTy _ typs -> do
-#endif
     typDocs <- docSharedWrapper layoutType `mapM` typs
     hasComments <- hasAnyCommentsBelow ltype
     let specialCommaSep = appSep $ docLit $ Text.pack " ,"
@@ -755,27 +743,20 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
 #else
   HsTyLit lit -> case lit of
 #endif
-#if MIN_VERSION_ghc(8,2,0) /* ghc-8.2 */
     HsNumTy (SourceText srctext) _ -> docLit $ Text.pack srctext
     HsNumTy NoSourceText _ ->
       error "overLitValBriDoc: literal with no SourceText"
     HsStrTy (SourceText srctext) _ -> docLit $ Text.pack srctext
     HsStrTy NoSourceText _ ->
       error "overLitValBriDoc: literal with no SourceText"
-#else /* ghc-8.0 */
-    HsNumTy srctext _ -> docLit $ Text.pack srctext
-    HsStrTy srctext _ -> docLit $ Text.pack srctext
-#endif
 #if !MIN_VERSION_ghc(8,6,0)
   HsCoreTy{} -> -- TODO
     briDocByExactInlineOnly "HsCoreTy{}" ltype
 #endif
   HsWildCardTy _ ->
     docLit $ Text.pack "_"
-#if MIN_VERSION_ghc(8,2,0) /* ghc-8.2 */
   HsSumTy{} -> -- TODO
     briDocByExactInlineOnly "HsSumTy{}" ltype
-#endif
 #if MIN_VERSION_ghc(8,6,0)
   HsStarTy _ isUnicode -> do
     if isUnicode
diff --git a/src/Language/Haskell/Brittany/Internal/Prelude.hs b/src/Language/Haskell/Brittany/Internal/Prelude.hs
index a0757d8..79e2975 100644
--- a/src/Language/Haskell/Brittany/Internal/Prelude.hs
+++ b/src/Language/Haskell/Brittany/Internal/Prelude.hs
@@ -1,4 +1,4 @@
-#if !MIN_VERSION_ghc(8,4,0) /* ghc-8.0, ghc-8.2 */
+#if !MIN_VERSION_ghc(8,4,0) /* ghc-8.2 */
 {-# LANGUAGE TypeFamilies #-}
 #endif
 
@@ -411,7 +411,7 @@ todo :: a
 todo = error "todo"
 
 
-#if !MIN_VERSION_ghc(8,4,0) /* ghc-8.0, ghc-8.2 */
+#if !MIN_VERSION_ghc(8,4,0) /* ghc-8.2 */
 type family IdP p
 type instance IdP GhcPs = RdrName
 
@@ -422,7 +422,7 @@ type GhcPs = RdrName
 #if MIN_VERSION_ghc(8,8,0)
 ghcDL :: GHC.HasSrcSpan a => a -> GHC.Located (GHC.SrcSpanLess a)
 ghcDL = GHC.dL
-#else              /* ghc-8.0 8.2 8.4 8.6 */
+#else              /* ghc-8.2 8.4 8.6 */
 ghcDL :: GHC.Located a -> GHC.Located a
 ghcDL x = x
 #endif
diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/src/Language/Haskell/Brittany/Internal/Types.hs
index 620a39b..f402e56 100644
--- a/src/Language/Haskell/Brittany/Internal/Types.hs
+++ b/src/Language/Haskell/Brittany/Internal/Types.hs
@@ -32,9 +32,7 @@ data PerItemConfig = PerItemConfig
   { _icd_perBinding :: Map String (CConfig Option)
   , _icd_perKey :: Map ExactPrint.Types.AnnKey (CConfig Option)
   }
-#if MIN_VERSION_ghc(8,2,0)
   deriving Data.Data.Data
-#endif
 
 type PPM = MultiRWSS.MultiRWS
   '[Map ExactPrint.AnnKey ExactPrint.Anns, PerItemConfig, Config, ExactPrint.Anns]
diff --git a/stack-8.0.2.yaml b/stack-8.0.2.yaml
deleted file mode 100644
index 80928db..0000000
--- a/stack-8.0.2.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-resolver: lts-9.0
-
-extra-deps:
-  - monad-memo-0.4.1
-  - czipwith-1.0.1.0
-  - butcher-1.3.1.1
-  - data-tree-print-0.1.0.0
-  - deque-0.2
-  - ghc-exactprint-0.5.8.0
-
-packages:
-  - .
\ No newline at end of file
diff --git a/stack-8.0.2.yaml.lock b/stack-8.0.2.yaml.lock
deleted file mode 100644
index 08d3ffb..0000000
--- a/stack-8.0.2.yaml.lock
+++ /dev/null
@@ -1,54 +0,0 @@
-# This file was autogenerated by Stack.
-# You should not edit this file by hand.
-# For more information, please see the documentation at:
-#   https://docs.haskellstack.org/en/stable/lock_files
-
-packages:
-- completed:
-    hackage: monad-memo-0.4.1@sha256:d7575b0c89ad21818ca5746170d10a3b92f01fdf9028fa37d3a370e42b24b38b,3672
-    pantry-tree:
-      size: 1823
-      sha256: 8d7bcc8a8bce43804613a160fd7f0fea7869a54e530a9f1b9f9e853ec4e00b57
-  original:
-    hackage: monad-memo-0.4.1
-- completed:
-    hackage: czipwith-1.0.1.0@sha256:30751c5a92488304863f20403cd8e9d4fee2b5def0b656a3d979aa3331a09c00,1652
-    pantry-tree:
-      size: 323
-      sha256: acd60968c5a1945741204751243f88d1af1c152018c2d9575f62c0805825f44f
-  original:
-    hackage: czipwith-1.0.1.0
-- completed:
-    hackage: butcher-1.3.1.1@sha256:d5734df2e42c28c5a8419eb8251cc531e5f5e6a13794b2ae1dac04abd1c359ad,3242
-    pantry-tree:
-      size: 1197
-      sha256: 057b5c8aa0211951337d87cda1f3d4c6f049945314f6fc7883394eebac79be5b
-  original:
-    hackage: butcher-1.3.1.1
-- completed:
-    hackage: data-tree-print-0.1.0.0@sha256:6610723626501d3ab65dc2290c0de59de8d042caf72a1db1e0cd01e84d229346,1547
-    pantry-tree:
-      size: 272
-      sha256: caa741fd498f754b42d45a16aae455056d5e71df51e960fce1579b8e8b6496ad
-  original:
-    hackage: data-tree-print-0.1.0.0
-- completed:
-    hackage: deque-0.2@sha256:a9736298cd04472924b3b681b3791c99e8b6009a6e5df1ff13dd57457109ad43,877
-    pantry-tree:
-      size: 205
-      sha256: c48e1f58dfac107ba9dd8d159d4c033fd72521de678204788e3f01f7a2e17546
-  original:
-    hackage: deque-0.2
-- completed:
-    hackage: ghc-exactprint-0.5.8.0@sha256:71915a08a7d442d39a63cb3b0fbd90b7dacd19bc4b05bac5c53b6e8a0d931b7b,7728
-    pantry-tree:
-      size: 83871
-      sha256: 3998143d33f7de29b31e8cf8d1b207c1fb4962f819fc820e209e1eecbf7e5a35
-  original:
-    hackage: ghc-exactprint-0.5.8.0
-snapshots:
-- completed:
-    size: 533451
-    url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/9/0.yaml
-    sha256: 27f29b231b39ea68e967a7a4346b2693a49d77c50f41fc0c276e11189a538da7
-  original: lts-9.0

From 259c949211448eee97d5cb8e9db97e42e113235f Mon Sep 17 00:00:00 2001
From: Taylor Fausak <taylor@fausak.me>
Date: Sun, 15 Nov 2020 11:32:34 -0500
Subject: [PATCH 11/13] Drop support for GHC 8.2

---
 .github/workflows/ci.yaml                     |  3 --
 .travis.yml                                   | 20 ---------
 Makefile                                      |  7 +--
 README.md                                     |  2 +-
 brittany.cabal                                |  6 +--
 .../Brittany/Internal/ExactPrintUtils.hs      |  5 ---
 .../Brittany/Internal/Layouters/Decl.hs       | 38 +++-------------
 .../Brittany/Internal/Layouters/Expr.hs       | 44 ++++---------------
 .../Brittany/Internal/Layouters/Expr.hs-boot  |  4 --
 .../Brittany/Internal/Layouters/Pattern.hs    |  8 ++--
 .../Brittany/Internal/Layouters/Type.hs       |  6 +--
 .../Haskell/Brittany/Internal/Prelude.hs      | 17 +------
 .../Haskell/Brittany/Internal/Utils.hs        |  2 -
 stack-8.2.2.yaml                              |  9 ----
 stack-8.2.2.yaml.lock                         | 33 --------------
 15 files changed, 28 insertions(+), 176 deletions(-)
 delete mode 100644 stack-8.2.2.yaml
 delete mode 100644 stack-8.2.2.yaml.lock

diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 7ad0476..6fb70ec 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -26,9 +26,6 @@ jobs:
           - os: ubuntu-18.04
             ghc: 8.4.4
             cabal: 3.2.0.0
-          - os: ubuntu-18.04
-            ghc: 8.2.2
-            cabal: 3.2.0.0
     runs-on: ${{ matrix.os }}
     steps:
       - uses: actions/checkout@v2
diff --git a/.travis.yml b/.travis.yml
index cd70c46..d9b2b07 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -43,16 +43,8 @@ matrix:
 
   ##### OSX test via stack #####
 
-  # Build on macOS in addition to Linux
-  - env: BUILD=stack ARGS="--stack-yaml stack-8.2.2.yaml"
-    compiler: ": #stack 8.2.2 osx"
-    os: osx
-
   ##### CABAL #####
 
-  - env: BUILD=cabal GHCVER=8.2.2 CABALVER=1.24 HAPPYVER=1.19.5 ALEXVER=3.1.7
-    compiler: ": #cabal 8.2.2"
-    addons: {apt: {packages: [cabal-install-1.24,ghc-8.2.2,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
   - env: BUILD=cabal GHCVER=8.4.4 CABALVER=1.24 HAPPYVER=1.19.5 ALEXVER=3.1.7
     compiler: ": #cabal 8.4.4"
     addons: {apt: {packages: [cabal-install-1.24,ghc-8.4.4,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
@@ -66,17 +58,8 @@ matrix:
   #  compiler: ": #GHC HEAD"
   #  addons: {apt: {packages: [cabal-install-head,ghc-head,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
 
-  ##### CABAL DIST CHECK
-
-  - env: BUILD=cabaldist GHCVER=8.2.2 CABALVER=1.24 HAPPYVER=1.19.5 ALEXVER=3.1.7
-    compiler: ": #cabal 8.2.2 dist"
-    addons: {apt: {packages: [cabal-install-1.24,ghc-8.2.2,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
-
   ##### CANEW #####
 
-  - env: BUILD=canew GHCVER=8.2.2 CABALVER=2.0 HAPPYVER=1.19.5 ALEXVER=3.1.7
-    compiler: ": #cabal new 8.2.2"
-    addons: {apt: {packages: [cabal-install-2.0,ghc-8.2.2,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
   - env: BUILD=canew GHCVER=8.8.1 CABALVER=3.0 HAPPYVER=1.19.5 ALEXVER=3.1.7
     compiler: ": #cabal new 8.8.1"
     addons: {apt: {packages: [cabal-install-3.0,ghc-8.8.1,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
@@ -89,9 +72,6 @@ matrix:
     compiler: ": #stack default"
     addons: {apt: {packages: [libgmp-dev]}}
 
-  - env: BUILD=stack ARGS="--stack-yaml stack-8.2.2.yaml"
-    compiler: ": #stack 8.2.2"
-    addons: {apt: {packages: [libgmp-dev]}}
   - env: BUILD=stack ARGS="--stack-yaml stack-8.4.3.yaml"
     compiler: ": #stack 8.4.3"
     addons: {apt: {packages: [libgmp-dev]}}
diff --git a/Makefile b/Makefile
index c7524be..1017b9a 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ test:
 
 .PHONY: test-all
 test-all:
-	$(MAKE) test test-8.6.5 test-8.4.3 test-8.2.2
+	$(MAKE) test test-8.6.5 test-8.4.3
 
 .PHONY: test-8.6.5
 test-8.6.5:
@@ -16,8 +16,3 @@ test-8.6.5:
 test-8.4.3:
 	echo "test 8.4.3"
 	stack test --stack-yaml stack-8.4.3.yaml --work-dir .stack-work-8.4.3
-
-.PHONY: test-8.2.2
-test-8.2.2:
-	echo "test 8.2.2"
-	stack test --stack-yaml stack-8.2.2.yaml --work-dir .stack-work-8.2.2
diff --git a/README.md b/README.md
index b009a37..56f42f0 100644
--- a/README.md
+++ b/README.md
@@ -48,7 +48,7 @@ log the size of the input, but _not_ the full input/output of requests.)
 
 # Other usage notes
 
-- Supports GHC versions `8.2`, `8.4`, `8.6`, `8.8`.
+- Supports GHC versions `8.4`, `8.6`, `8.8`.
 - included in stackage with lts>=10.0 (or nightlies dating to >=2017-11-15)
 - config (file) documentation is lacking.
 - some config values can not be configured via commandline yet.
diff --git a/brittany.cabal b/brittany.cabal
index 0c3ed7c..ffeb0f2 100644
--- a/brittany.cabal
+++ b/brittany.cabal
@@ -91,8 +91,8 @@ library {
     -fno-warn-redundant-constraints
   }
   build-depends:
-    { base >=4.10 && <4.15
-    , ghc >=8.2.1 && <8.11
+    { base >=4.11 && <4.15
+    , ghc >=8.4.1 && <8.11
     , ghc-paths >=0.1.0.9 && <0.2
     , ghc-exactprint >=0.5.8 && <0.6.4
     , transformers >=0.5.2.0 && <0.6
@@ -118,7 +118,7 @@ library {
     , semigroups >=0.18.2 && <0.20
     , cmdargs >=0.10.14 && <0.11
     , czipwith >=1.0.1.0 && <1.1
-    , ghc-boot-th >=8.2.1 && <8.11
+    , ghc-boot-th >=8.4.1 && <8.11
     , filepath >=1.4.1.0 && <1.5
     , random >= 1.1 && <1.2
     }
diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
index 7c06f69..b7ac608 100644
--- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
+++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
@@ -320,10 +320,5 @@ withTransformedAnns ast m = MultiRWSS.mGetRawR >>= \case
     in  annsBalanced
 
 
-#if MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
 warnExtractorCompat :: GHC.Warn -> String
 warnExtractorCompat (GHC.Warn _ (L _ s)) = s
-#else /* ghc-8.2 */
-warnExtractorCompat :: GenLocated l String -> String
-warnExtractorCompat (L _ s) = s
-#endif
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
index 4a86954..ae0b232 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
@@ -98,7 +98,7 @@ layoutSig :: ToBriDoc Sig
 layoutSig lsig@(L _loc sig) = case sig of
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   TypeSig _ names (HsWC _ (HsIB _ typ)) -> layoutNamesAndType Nothing names typ
-#else /* ghc-8.2 */
+#else /* ghc-8.4 */
   TypeSig names (HsWC _ (HsIB _ typ _)) -> layoutNamesAndType Nothing names typ
 #endif
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
@@ -124,7 +124,7 @@ layoutSig lsig@(L _loc sig) = case sig of
         <> Text.pack " #-}"
 #if MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
   ClassOpSig _ False names (HsIB _ typ) -> layoutNamesAndType Nothing names typ
-#else /* ghc-8.2 */
+#else /* ghc-8.4 */
   ClassOpSig False names (HsIB _ typ _) -> layoutNamesAndType Nothing names typ
 #endif
 #if MIN_VERSION_ghc(8,6,0)
@@ -165,19 +165,11 @@ layoutSig lsig@(L _loc sig) = case sig of
 
 specStringCompat
   :: MonadMultiWriter [BrittanyError] m => LSig GhcPs -> InlineSpec -> m String
-#if MIN_VERSION_ghc(8,4,0)
 specStringCompat ast = \case
   NoUserInline    -> mTell [ErrorUnknownNode "NoUserInline" ast] $> ""
   Inline          -> pure "INLINE "
   Inlinable       -> pure "INLINABLE "
   NoInline        -> pure "NOINLINE "
-#else
-specStringCompat _ = \case
-  Inline          -> pure "INLINE "
-  Inlinable       -> pure "INLINABLE "
-  NoInline        -> pure "NOINLINE "
-  EmptyInlineSpec -> pure ""
-#endif
 
 layoutGuardLStmt :: ToBriDoc' (Stmt GhcPs (LHsExpr GhcPs))
 layoutGuardLStmt lgstmt@(L _ stmtLR) = docWrapNode lgstmt $ case stmtLR of
@@ -349,10 +341,8 @@ layoutPatternBind funId binderDoc lmatch@(L _ match) = do
   mIdStr <- case match of
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     Match _ (FunRhs matchId _ _) _ _ -> Just <$> lrdrNameToTextAnn matchId
-#elif MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
-    Match (FunRhs matchId _ _) _ _ -> Just <$> lrdrNameToTextAnn matchId
 #else
-    Match (FunRhs matchId _ _) _ _ _ -> Just <$> lrdrNameToTextAnn matchId
+    Match (FunRhs matchId _ _) _ _ -> Just <$> lrdrNameToTextAnn matchId
 #endif
     _ -> pure Nothing
   let mIdStr' = fixPatternBindIdentifier match <$> mIdStr
@@ -774,28 +764,16 @@ layoutLPatSyn
   :: Located (IdP GhcPs)
   -> HsPatSynDetails (Located (IdP GhcPs))
   -> ToBriDocM BriDocNumbered
-#if MIN_VERSION_ghc(8,4,0)
 layoutLPatSyn name (PrefixCon vars) = do
-#else
-layoutLPatSyn name (PrefixPatSyn vars) = do
-#endif
   docName <- lrdrNameToTextAnn name
   names <- mapM lrdrNameToTextAnn vars
   docSeq . fmap appSep $ docLit docName : (docLit <$> names)
-#if MIN_VERSION_ghc(8,4,0)
 layoutLPatSyn name (InfixCon left right) = do
-#else
-layoutLPatSyn name (InfixPatSyn left right) = do
-#endif
   leftDoc <- lrdrNameToTextAnn left
   docName <- lrdrNameToTextAnn name
   rightDoc <- lrdrNameToTextAnn right
   docSeq . fmap (appSep . docLit) $ [leftDoc, docName, rightDoc]
-#if MIN_VERSION_ghc(8,4,0)
 layoutLPatSyn name (RecCon recArgs) = do
-#else
-layoutLPatSyn name (RecordPatSyn recArgs) = do
-#endif
   docName <- lrdrNameToTextAnn name
   args <- mapM (lrdrNameToTextAnn . recordPatSynSelectorId) recArgs
   docSeq . fmap docLit
@@ -895,14 +873,14 @@ layoutTyVarBndr needsSep lbndr@(L _ bndr) = do
 #if MIN_VERSION_ghc(8,6,0)    /* 8.6 */
     XTyVarBndr{} -> error "brittany internal error: XTyVarBndr"
     UserTyVar _ name -> do
-#else                         /* 8.2 8.4 */
+#else                         /* 8.4 */
     UserTyVar name -> do
 #endif
       nameStr <- lrdrNameToTextAnn name
       docSeq $ [docSeparator | needsSep] ++ [docLit nameStr]
 #if MIN_VERSION_ghc(8,6,0)    /* 8.6 */
     KindedTyVar _ name kind -> do
-#else                         /* 8.2 8.4 */
+#else                         /* 8.4 */
     KindedTyVar name kind -> do
 #endif
       nameStr <- lrdrNameToTextAnn name
@@ -939,14 +917,10 @@ layoutTyFamInstDecl inClass outerNode tfid = do
     FamEqn _ name pats _fixity typ = hsib_body $ tfid_eqn tfid
     bndrsMay = Nothing
     innerNode = outerNode
-#elif MIN_VERSION_ghc(8,4,0)
+#else
     FamEqn name pats _fixity typ = hsib_body $ tfid_eqn tfid
     bndrsMay = Nothing
     innerNode = outerNode
-#else
-    innerNode@(L _ (TyFamEqn name boundPats _fixity typ)) = tfid_eqn tfid
-    bndrsMay = Nothing
-    pats = hsib_body boundPats
 #endif
   docWrapNodePrior outerNode $ do
     nameStr   <- lrdrNameToTextAnn name
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
index 534496d..8c089c2 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
@@ -62,7 +62,7 @@ layoutExpr lexpr@(L _ expr) = do
       briDocByExactInlineOnly "HsRecFld" lexpr
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsOverLabel _ext _reboundFromLabel name ->
-#else                        /* ghc-8.2 */
+#else                        /* ghc-8.4 */
     HsOverLabel _reboundFromLabel name ->
 #endif
       let label = FastString.unpackFS name
@@ -174,14 +174,14 @@ layoutExpr lexpr@(L _ expr) = do
 #endif
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsLamCase _ (MG _ (L _ []) _) -> do
-#else                        /* ghc-8.2 */
+#else                        /* ghc-8.4 */
     HsLamCase (MG (L _ []) _ _ _) -> do
 #endif
       docSetParSpacing $ docAddBaseY BrIndentRegular $
         (docLit $ Text.pack "\\case {}")
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsLamCase _ (MG _ lmatches@(L _ matches) _) -> do
-#else                        /* ghc-8.2 */
+#else                        /* ghc-8.4 */
     HsLamCase (MG lmatches@(L _ matches) _ _ _) -> do
 #endif
       binderDoc   <- docLit $ Text.pack "->"
@@ -305,7 +305,7 @@ layoutExpr lexpr@(L _ expr) = do
     HsAppType XHsWildCardBndrs{} _ ->
       error "brittany internal error: HsAppType XHsWildCardBndrs"
     HsAppType (HsWC _ ty1) exp1 -> do
-#else                        /* ghc-8.2 */
+#else                        /* ghc-8.4 */
     HsAppType exp1 (HsWC _ ty1) -> do
 #endif
       t <- docSharedWrapper layoutType ty1
@@ -321,7 +321,7 @@ layoutExpr lexpr@(L _ expr) = do
             e
             (docSeq [docLit $ Text.pack "@", t ])
         ]
-#if !MIN_VERSION_ghc(8,6,0)   /* ghc-8.2 8.4 */
+#if !MIN_VERSION_ghc(8,6,0)   /* ghc-8.4 */
     HsAppTypeOut{} -> do
       -- TODO
       briDocByExactInlineOnly "HsAppTypeOut{}" lexpr
@@ -960,7 +960,7 @@ layoutExpr lexpr@(L _ expr) = do
             in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end]
     ExplicitList _ _ [] ->
       docLit $ Text.pack "[]"
-#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.2 8.4 */
+#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.4 */
     ExplicitPArr{} -> do
       -- TODO
       briDocByExactInlineOnly "ExplicitPArr{}" lexpr
@@ -1044,7 +1044,7 @@ layoutExpr lexpr@(L _ expr) = do
     ExprWithTySig XHsWildCardBndrs{} _ ->
       error "brittany internal error: ExprWithTySig XHsWildCardBndrs"
     ExprWithTySig (HsWC _ (HsIB _ typ1)) exp1 -> do
-#else /* ghc-8.2 */
+#else /* ghc-8.4 */
     ExprWithTySig exp1 (HsWC _ (HsIB _ typ1 _)) -> do
 #endif
       expDoc <- docSharedWrapper layoutExpr exp1
@@ -1054,7 +1054,7 @@ layoutExpr lexpr@(L _ expr) = do
         , appSep $ docLit $ Text.pack "::"
         , typDoc
         ]
-#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.2 8.4 */
+#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.4 */
     ExprWithTySigOut{} -> do
       -- TODO
       briDocByExactInlineOnly "ExprWithTySigOut{}" lexpr
@@ -1103,7 +1103,7 @@ layoutExpr lexpr@(L _ expr) = do
             ]
     ArithSeq{} ->
       briDocByExactInlineOnly "ArithSeq" lexpr
-#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.2 8.4 */
+#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.4 */
     PArrSeq{} -> do
       -- TODO
       briDocByExactInlineOnly "PArrSeq{}" lexpr
@@ -1331,7 +1331,6 @@ recordExpression dotdot indentPolicy lexpr nameDoc rFs@(rF1:rFr) = do
             in [line1] ++ lineR ++ [dotdotLine, lineN]
           )
 
-#if MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
 litBriDoc :: HsLit GhcPs -> BriDocFInt
 litBriDoc = \case
   HsChar       (SourceText t) _c                         -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\'']
@@ -1355,28 +1354,3 @@ overLitValBriDoc = \case
   HsFractional (FL (SourceText t) _ _) -> BDFLit $ Text.pack t
   HsIsString (SourceText t) _ -> BDFLit $ Text.pack t
   _ -> error "overLitValBriDoc: literal with no SourceText"
-#else                        /* ghc-8.2 */
-litBriDoc :: HsLit -> BriDocFInt
-litBriDoc = \case
-  HsChar       (SourceText t) _c          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\'']
-  HsCharPrim   (SourceText t) _c          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\'']
-  HsString     (SourceText t) _fastString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ FastString.unpackFS fastString
-  HsStringPrim (SourceText t) _byteString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ Data.ByteString.Char8.unpack byteString
-  HsInt        (SourceText t) _i          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsIntPrim    (SourceText t) _i          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsWordPrim   (SourceText t) _i          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsInt64Prim  (SourceText t) _i          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsWord64Prim (SourceText t) _i          -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsInteger    (SourceText t) _i _type    -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i
-  HsRat        (FL t _) _type             -> BDFLit $ Text.pack t
-  HsFloatPrim  (FL t _)                   -> BDFLit $ Text.pack t
-  HsDoublePrim (FL t _)                   -> BDFLit $ Text.pack t
-  _ -> error "litBriDoc: literal with no SourceText"
-
-overLitValBriDoc :: OverLitVal -> BriDocFInt
-overLitValBriDoc = \case
-  HsIntegral (SourceText t) _        -> BDFLit $ Text.pack t
-  HsFractional (FL t _) -> BDFLit $ Text.pack t
-  HsIsString (SourceText t) _        -> BDFLit $ Text.pack t
-  _ -> error "overLitValBriDoc: literal with no SourceText"
-#endif
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot
index 606790b..e3be109 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot
@@ -28,10 +28,6 @@ layoutExpr :: ToBriDoc HsExpr
 
 -- layoutStmt :: ToBriDoc' (StmtLR GhcPs GhcPs (LHsExpr GhcPs))
 
-#if   MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
 litBriDoc :: HsLit GhcPs -> BriDocFInt
-#else /* ghc-8.2 */
-litBriDoc :: HsLit -> BriDocFInt
-#endif
 
 overLitValBriDoc :: OverLitVal -> BriDocFInt
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
index b0b13f2..fb0ba51 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
@@ -50,14 +50,14 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
     -- _ -> expr
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   VarPat _ n ->
-#else                        /* ghc-8.2 8.4 */
+#else                        /* ghc-8.4 */
   VarPat   n ->
 #endif
     fmap Seq.singleton $ docLit $ lrdrNameToText n
     -- abc -> expr
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   LitPat _ lit ->
-#else                        /* ghc-8.2 8.4 */
+#else                        /* ghc-8.4 */
   LitPat lit ->
 #endif
     fmap Seq.singleton $ allocateNode $ litBriDoc lit
@@ -66,7 +66,7 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
   ParPat _ inner -> do
 #elif MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
   ParPat _ inner -> do
-#else                        /* ghc-8.2 8.4 */
+#else                        /* ghc-8.4 */
   ParPat inner -> do
 #endif
     -- (nestedpat) -> expr
@@ -202,7 +202,7 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
   SigPat _ pat1 (HsWC _ (HsIB _ ty1)) -> do
 #elif MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
   SigPat (HsWC _ (HsIB _ ty1)) pat1 -> do
-#else                        /* ghc-8.2 */
+#else                        /* ghc-8.4 */
   SigPatIn pat1 (HsWC _ (HsIB _ ty1 _)) -> do
 #endif
     -- i :: Int -> expr
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
index 2060904..a2b55d7 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
@@ -44,14 +44,14 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
   -- _ | traceShow (ExactPrint.Types.mkAnnKey ltype) False -> error "impossible"
 #if MIN_VERSION_ghc(8,6,0)
   HsTyVar _ promoted name -> do
-#else   /* ghc-8.2 ghc-8.4 */
+#else   /* ghc-8.4 */
   HsTyVar promoted name -> do
 #endif
     t <- lrdrNameToTextAnnTypeEqualityIsSpecial name
     case promoted of
 #if MIN_VERSION_ghc(8,8,0)
       IsPromoted -> docSeq
-#else /* ghc-8.2 8.4 8.6 */
+#else /* ghc-8.4 8.6 */
       Promoted -> docSeq
 #endif
         [ docSeparator
@@ -541,7 +541,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
   --     }
 #if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   HsIParamTy _ (L _ (HsIPName ipName)) typ1 -> do
-#else                        /* ghc-8.2 */
+#else                        /* ghc-8.4 */
   HsIParamTy (L _ (HsIPName ipName)) typ1 -> do
 #endif
     typeDoc1 <- docSharedWrapper layoutType typ1
diff --git a/src/Language/Haskell/Brittany/Internal/Prelude.hs b/src/Language/Haskell/Brittany/Internal/Prelude.hs
index 79e2975..e9a6979 100644
--- a/src/Language/Haskell/Brittany/Internal/Prelude.hs
+++ b/src/Language/Haskell/Brittany/Internal/Prelude.hs
@@ -1,8 +1,3 @@
-#if !MIN_VERSION_ghc(8,4,0) /* ghc-8.2 */
-{-# LANGUAGE TypeFamilies #-}
-#endif
-
-
 module Language.Haskell.Brittany.Internal.Prelude
   ( module E
   , module Language.Haskell.Brittany.Internal.Prelude
@@ -16,9 +11,7 @@ where
 #if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */
 import GHC.Hs.Extension               as E ( GhcPs )
 #else
-#  if MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
 import HsExtension                    as E ( GhcPs )
-#  endif /* ghc-8.4 */
 #endif /* ghc-8.10.1 */
 
 import RdrName                        as E ( RdrName )
@@ -411,18 +404,10 @@ todo :: a
 todo = error "todo"
 
 
-#if !MIN_VERSION_ghc(8,4,0) /* ghc-8.2 */
-type family IdP p
-type instance IdP GhcPs = RdrName
-
-type GhcPs = RdrName
-#endif
-
-
 #if MIN_VERSION_ghc(8,8,0)
 ghcDL :: GHC.HasSrcSpan a => a -> GHC.Located (GHC.SrcSpanLess a)
 ghcDL = GHC.dL
-#else              /* ghc-8.2 8.4 8.6 */
+#else              /* ghc-8.4 8.6 */
 ghcDL :: GHC.Located a -> GHC.Located a
 ghcDL x = x
 #endif
diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs
index 0a0d31f..4b4061e 100644
--- a/src/Language/Haskell/Brittany/Internal/Utils.hs
+++ b/src/Language/Haskell/Brittany/Internal/Utils.hs
@@ -62,9 +62,7 @@ import qualified Data.Generics.Uniplate.Direct as Uniplate
 #if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */
 import qualified GHC.Hs.Extension as HsExtension
 #else
-#  if MIN_VERSION_ghc(8,4,0) /* ghc-8.4 */
 import qualified HsExtension
-#  endif /* ghc-8.4 */
 #endif /* ghc-8.10.1 */
 
 
diff --git a/stack-8.2.2.yaml b/stack-8.2.2.yaml
deleted file mode 100644
index 1ce5fc3..0000000
--- a/stack-8.2.2.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-resolver: lts-11.1
-
-extra-deps:
-  - czipwith-1.0.1.0
-  - butcher-1.3.1.1
-  - ghc-exactprint-0.5.8.0
-
-packages:
-  - .
diff --git a/stack-8.2.2.yaml.lock b/stack-8.2.2.yaml.lock
deleted file mode 100644
index 8bacbb2..0000000
--- a/stack-8.2.2.yaml.lock
+++ /dev/null
@@ -1,33 +0,0 @@
-# This file was autogenerated by Stack.
-# You should not edit this file by hand.
-# For more information, please see the documentation at:
-#   https://docs.haskellstack.org/en/stable/lock_files
-
-packages:
-- completed:
-    hackage: czipwith-1.0.1.0@sha256:30751c5a92488304863f20403cd8e9d4fee2b5def0b656a3d979aa3331a09c00,1652
-    pantry-tree:
-      size: 323
-      sha256: acd60968c5a1945741204751243f88d1af1c152018c2d9575f62c0805825f44f
-  original:
-    hackage: czipwith-1.0.1.0
-- completed:
-    hackage: butcher-1.3.1.1@sha256:d5734df2e42c28c5a8419eb8251cc531e5f5e6a13794b2ae1dac04abd1c359ad,3242
-    pantry-tree:
-      size: 1197
-      sha256: 057b5c8aa0211951337d87cda1f3d4c6f049945314f6fc7883394eebac79be5b
-  original:
-    hackage: butcher-1.3.1.1
-- completed:
-    hackage: ghc-exactprint-0.5.8.0@sha256:71915a08a7d442d39a63cb3b0fbd90b7dacd19bc4b05bac5c53b6e8a0d931b7b,7728
-    pantry-tree:
-      size: 83871
-      sha256: 3998143d33f7de29b31e8cf8d1b207c1fb4962f819fc820e209e1eecbf7e5a35
-  original:
-    hackage: ghc-exactprint-0.5.8.0
-snapshots:
-- completed:
-    size: 505335
-    url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/11/1.yaml
-    sha256: 59c853f993e736f430ad20d03eb5441c715d84359c035de906f970841887a8f8
-  original: lts-11.1

From e36d9bc465a4b1241812d5137d11b0cec3954548 Mon Sep 17 00:00:00 2001
From: Taylor Fausak <taylor@fausak.me>
Date: Sun, 15 Nov 2020 11:56:19 -0500
Subject: [PATCH 12/13] Drop support for GHC 8.4

---
 .github/workflows/ci.yaml                     |   3 -
 .travis.yml                                   |   6 -
 Makefile                                      |   7 +-
 README.md                                     |   2 +-
 brittany.cabal                                |   6 +-
 src/Language/Haskell/Brittany/Internal.hs     |  18 --
 .../Brittany/Internal/ExactPrintUtils.hs      |   8 -
 .../Brittany/Internal/Layouters/DataDecl.hs   |  46 ----
 .../Brittany/Internal/Layouters/Decl.hs       | 123 +----------
 .../Brittany/Internal/Layouters/Expr.hs       | 197 +-----------------
 .../Haskell/Brittany/Internal/Layouters/IE.hs |  24 ---
 .../Brittany/Internal/Layouters/Import.hs     |   4 -
 .../Brittany/Internal/Layouters/Pattern.hs    |  48 +----
 .../Brittany/Internal/Layouters/Stmt.hs       |  20 --
 .../Brittany/Internal/Layouters/Type.hs       | 153 +-------------
 .../Haskell/Brittany/Internal/Prelude.hs      |   2 +-
 .../Haskell/Brittany/Internal/Utils.hs        |   5 +-
 stack-8.4.3.yaml                              |   4 -
 stack-8.4.3.yaml.lock                         |  19 --
 19 files changed, 19 insertions(+), 676 deletions(-)
 delete mode 100644 stack-8.4.3.yaml
 delete mode 100644 stack-8.4.3.yaml.lock

diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 6fb70ec..ae70751 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -23,9 +23,6 @@ jobs:
           - os: ubuntu-18.04
             ghc: 8.6.5
             cabal: 3.2.0.0
-          - os: ubuntu-18.04
-            ghc: 8.4.4
-            cabal: 3.2.0.0
     runs-on: ${{ matrix.os }}
     steps:
       - uses: actions/checkout@v2
diff --git a/.travis.yml b/.travis.yml
index d9b2b07..19a5ca9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -45,9 +45,6 @@ matrix:
 
   ##### CABAL #####
 
-  - env: BUILD=cabal GHCVER=8.4.4 CABALVER=1.24 HAPPYVER=1.19.5 ALEXVER=3.1.7
-    compiler: ": #cabal 8.4.4"
-    addons: {apt: {packages: [cabal-install-1.24,ghc-8.4.4,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
   - env: BUILD=cabal GHCVER=8.6.5 CABALVER=1.24 HAPPYVER=1.19.5 ALEXVER=3.1.7
     compiler: ": #cabal 8.6.5"
     addons: {apt: {packages: [cabal-install-1.24,ghc-8.6.5,happy-1.19.5,alex-3.1.7], sources: [hvr-ghc]}}
@@ -72,9 +69,6 @@ matrix:
     compiler: ": #stack default"
     addons: {apt: {packages: [libgmp-dev]}}
 
-  - env: BUILD=stack ARGS="--stack-yaml stack-8.4.3.yaml"
-    compiler: ": #stack 8.4.3"
-    addons: {apt: {packages: [libgmp-dev]}}
   - env: BUILD=stack ARGS="--stack-yaml stack-8.6.5.yaml"
     compiler: ": #stack 8.6.5"
     addons: {apt: {packages: [libgmp-dev]}}
diff --git a/Makefile b/Makefile
index 1017b9a..ca0a962 100644
--- a/Makefile
+++ b/Makefile
@@ -5,14 +5,9 @@ test:
 
 .PHONY: test-all
 test-all:
-	$(MAKE) test test-8.6.5 test-8.4.3
+	$(MAKE) test test-8.6.5
 
 .PHONY: test-8.6.5
 test-8.6.5:
 	echo "test 8.6.5"
 	stack test --stack-yaml stack-8.6.5.yaml --work-dir .stack-work-8.6.5
-
-.PHONY: test-8.4.3
-test-8.4.3:
-	echo "test 8.4.3"
-	stack test --stack-yaml stack-8.4.3.yaml --work-dir .stack-work-8.4.3
diff --git a/README.md b/README.md
index 56f42f0..eec9c4c 100644
--- a/README.md
+++ b/README.md
@@ -48,7 +48,7 @@ log the size of the input, but _not_ the full input/output of requests.)
 
 # Other usage notes
 
-- Supports GHC versions `8.4`, `8.6`, `8.8`.
+- Supports GHC versions `8.6`, `8.8`.
 - included in stackage with lts>=10.0 (or nightlies dating to >=2017-11-15)
 - config (file) documentation is lacking.
 - some config values can not be configured via commandline yet.
diff --git a/brittany.cabal b/brittany.cabal
index ffeb0f2..cd541fb 100644
--- a/brittany.cabal
+++ b/brittany.cabal
@@ -91,8 +91,8 @@ library {
     -fno-warn-redundant-constraints
   }
   build-depends:
-    { base >=4.11 && <4.15
-    , ghc >=8.4.1 && <8.11
+    { base >=4.12 && <4.15
+    , ghc >=8.6.1 && <8.11
     , ghc-paths >=0.1.0.9 && <0.2
     , ghc-exactprint >=0.5.8 && <0.6.4
     , transformers >=0.5.2.0 && <0.6
@@ -118,7 +118,7 @@ library {
     , semigroups >=0.18.2 && <0.20
     , cmdargs >=0.10.14 && <0.11
     , czipwith >=1.0.1.0 && <1.1
-    , ghc-boot-th >=8.4.1 && <8.11
+    , ghc-boot-th >=8.6.1 && <8.11
     , filepath >=1.4.1.0 && <1.5
     , random >= 1.1 && <1.2
     }
diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs
index 1fc3e12..57e6e8f 100644
--- a/src/Language/Haskell/Brittany/Internal.hs
+++ b/src/Language/Haskell/Brittany/Internal.hs
@@ -518,17 +518,10 @@ ppModule lmod@(L _loc _m@(HsModule _name _exports _ decls _ _)) = do
     _ -> return ()
 
 getDeclBindingNames :: LHsDecl GhcPs -> [String]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 getDeclBindingNames (L _ decl) = case decl of
   SigD _ (TypeSig _ ns _) -> ns <&> \(L _ n) -> Text.unpack (rdrNameToText n)
   ValD _ (FunBind _ (L _ n) _ _ _) -> [Text.unpack $ rdrNameToText n]
   _                              -> []
-#else
-getDeclBindingNames (L _ decl) = case decl of
-  SigD (TypeSig ns _) -> ns <&> \(L _ n) -> Text.unpack (rdrNameToText n)
-  ValD (FunBind (L _ n) _ _ _ _) -> [Text.unpack $ rdrNameToText n]
-  _                              -> []
-#endif
 
 
 -- Prints the information associated with the module annotation
@@ -586,26 +579,15 @@ ppPreamble lmod@(L loc m@(HsModule _ _ _ _ _ _)) = do
 
 _sigHead :: Sig GhcPs -> String
 _sigHead = \case
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   TypeSig _ names _ ->
-#else
-  TypeSig names _ ->
-#endif
     "TypeSig " ++ intercalate "," (Text.unpack . lrdrNameToText <$> names)
   _ -> "unknown sig"
 
 _bindHead :: HsBind GhcPs -> String
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 _bindHead = \case
   FunBind _ fId _ _ [] -> "FunBind " ++ (Text.unpack $ lrdrNameToText $ fId)
   PatBind _ _pat _ ([], []) -> "PatBind smth"
   _                           -> "unknown bind"
-#else
-_bindHead = \case
-  FunBind fId _ _ _ [] -> "FunBind " ++ (Text.unpack $ lrdrNameToText $ fId)
-  PatBind _pat _ _ _ ([], []) -> "PatBind smth"
-  _                           -> "unknown bind"
-#endif
 
 
 
diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
index b7ac608..29c126f 100644
--- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
+++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs
@@ -212,17 +212,9 @@ commentAnnFixTransform modul = SYB.everything (>>) genF modul
   genF = (\_ -> return ()) `SYB.extQ` exprF
   exprF :: Located (HsExpr GhcPs) -> ExactPrint.Transform ()
   exprF lexpr@(L _ expr) = case expr of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     RecordCon _ _ (HsRecFields fs@(_:_) Nothing) ->
-#else
-    RecordCon _ _ _ (HsRecFields fs@(_:_) Nothing) ->
-#endif
       moveTrailingComments lexpr (List.last fs)
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     RecordUpd _ _e fs@(_:_) ->
-#else
-    RecordUpd _e fs@(_:_) _cons _ _ _ ->
-#endif
       moveTrailingComments lexpr (List.last fs)
     _ -> return ()
 
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs
index 74b6d53..22f11d4 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs
@@ -44,20 +44,11 @@ layoutDataDecl
   -> LHsQTyVars GhcPs
   -> HsDataDefn GhcPs
   -> ToBriDocM BriDocNumbered
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 layoutDataDecl _ _ (XLHsQTyVars ext) _ = absurdExt ext
 layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of
-#else
-layoutDataDecl ltycl name (HsQTvs _ bndrs _) defn = case defn of
-#endif
   -- newtype MyType a b = MyType ..
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   HsDataDefn _ext NewType (L _ []) _ctype Nothing [cons] mDerivs -> case cons of
     (L _ (ConDeclH98 _ext consName (L _ False) _qvars (Just (L _ [])) details _conDoc)) ->
-#else
-  HsDataDefn NewType (L _ []) _ctype Nothing [cons] mDerivs -> case cons of
-    (L _ (ConDeclH98 consName Nothing (Just (L _ [])) details _conDoc)) ->
-#endif
       docWrapNode ltycl $ do
         nameStr     <- lrdrNameToTextAnn name
         consNameStr <- lrdrNameToTextAnn consName
@@ -82,11 +73,7 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs _) defn = case defn of
 
   -- data MyData a b
   -- (zero constructors)
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   HsDataDefn _ext DataType (L _ lhsContext) _ctype Nothing [] mDerivs ->
-#else
-  HsDataDefn DataType (L _ lhsContext) _ctype Nothing [] mDerivs ->
-#endif
     docWrapNode ltycl $ do
       lhsContextDoc <- docSharedWrapper createContextDoc lhsContext
       nameStr       <- lrdrNameToTextAnn name
@@ -100,17 +87,9 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs _) defn = case defn of
 
   -- data MyData = MyData ..
   -- data MyData = MyData { .. }
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   HsDataDefn _ext DataType (L _ lhsContext) _ctype Nothing [cons] mDerivs ->
-#else
-  HsDataDefn DataType (L _ lhsContext) _ctype Nothing [cons] mDerivs ->
-#endif
     case cons of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
       (L _ (ConDeclH98 _ext consName (L _ _hasExt) qvars mRhsContext details _conDoc)) ->
-#else
-      (L _ (ConDeclH98 consName (Just (HsQTvs _ qvars _)) mRhsContext details _conDoc)) ->
-#endif
         docWrapNode ltycl $ do
           lhsContextDoc <- docSharedWrapper createContextDoc lhsContext
           nameStr       <- lrdrNameToTextAnn name
@@ -266,18 +245,11 @@ createContextDoc (t1 : tR) = do
 createBndrDoc :: [LHsTyVarBndr GhcPs] -> ToBriDocM BriDocNumbered
 createBndrDoc bs = do
   tyVarDocs <- bs `forM` \case
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     (L _ (UserTyVar _ext vname)) -> return $ (lrdrNameToText vname, Nothing)
     (L _ (KindedTyVar _ext lrdrName kind)) -> do
-#else
-    (L _ (UserTyVar vname)) -> return $ (lrdrNameToText vname, Nothing)
-    (L _ (KindedTyVar lrdrName kind)) -> do
-#endif
       d <- docSharedWrapper layoutType kind
       return $ (lrdrNameToText lrdrName, Just $ d)
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     (L _ (XTyVarBndr ext)) -> absurdExt ext
-#endif
   docSeq
     $   List.intersperse docSeparator
     $   tyVarDocs
@@ -307,12 +279,8 @@ createDerivingPar derivs mainDoc = do
         <$> types
 
 derivingClauseDoc :: LHsDerivingClause GhcPs -> ToBriDocM BriDocNumbered
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 derivingClauseDoc (L _ (XHsDerivingClause ext)) = absurdExt ext
 derivingClauseDoc (L _ (HsDerivingClause _ext mStrategy types)) = case types of
-#else
-derivingClauseDoc (L _ (HsDerivingClause mStrategy types)) = case types of
-#endif
   (L _ []) -> docSeq []
   (L _ ts) ->
     let
@@ -330,12 +298,8 @@ derivingClauseDoc (L _ (HsDerivingClause mStrategy types)) = case types of
           $ docSeq
           $ List.intersperse docCommaSep
           $ ts <&> \case
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
             HsIB _ t -> layoutType t
             XHsImplicitBndrs x -> absurdExt x
-#else
-            HsIB _ t _ -> layoutType t
-#endif
         , whenMoreThan1Type ")"
         , rhsStrategy
         ]
@@ -344,7 +308,6 @@ derivingClauseDoc (L _ (HsDerivingClause mStrategy types)) = case types of
     (L _ StockStrategy          ) -> (docLitS " stock", docEmpty)
     (L _ AnyclassStrategy       ) -> (docLitS " anyclass", docEmpty)
     (L _ NewtypeStrategy        ) -> (docLitS " newtype", docEmpty)
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     lVia@(L _ (ViaStrategy viaTypes) ) ->
       ( docEmpty
       , case viaTypes of
@@ -355,7 +318,6 @@ derivingClauseDoc (L _ (HsDerivingClause mStrategy types)) = case types of
             ]
           XHsImplicitBndrs ext -> absurdExt ext
       )
-#endif
 
 docDeriving :: ToBriDocM BriDocNumbered
 docDeriving = docLitS "deriving"
@@ -473,12 +435,8 @@ createDetailsDoc consNameStr details = case details of
     :: [LConDeclField GhcPs]
     -> [(ToBriDocM BriDocNumbered, ToBriDocM BriDocNumbered)]
   mkFieldDocs = fmap $ \lField -> case lField of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     L _ (ConDeclField _ext names t _) -> createNamesAndTypeDoc lField names t
     L _ (XConDeclField x) -> absurdExt x
-#else
-    L _ (ConDeclField names t _) -> createNamesAndTypeDoc lField names t
-#endif
 
 createForallDoc :: [LHsTyVarBndr GhcPs] -> Maybe (ToBriDocM BriDocNumbered)
 createForallDoc []            = Nothing
@@ -497,12 +455,8 @@ createNamesAndTypeDoc lField names t =
       $   List.intersperse docCommaSep
       $   names
       <&> \case
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
         L _ (XFieldOcc x) -> absurdExt x
         L _ (FieldOcc _ fieldName) ->
-#else
-        L _ (FieldOcc fieldName _) ->
-#endif
             docLit =<< lrdrNameToTextAnn fieldName
     ]
   , docWrapNodeRest lField $ layoutType t
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
index ae0b232..f6f59a4 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
@@ -40,7 +40,7 @@ import qualified FastString
 #if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */
 import           GHC.Hs
 import           GHC.Hs.Extension (NoExtField (..))
-#elif MIN_VERSION_ghc(8,6,0)
+#else
 import           HsSyn
 import           HsExtension (NoExt (..))
 #endif
@@ -65,7 +65,6 @@ import           Data.Char (isUpper)
 
 
 layoutDecl :: ToBriDoc HsDecl
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 layoutDecl d@(L loc decl) = case decl of
   SigD _ sig  -> withTransformedAnns d $ layoutSig (L loc sig)
   ValD _ bind -> withTransformedAnns d $ layoutBind (L loc bind) >>= \case
@@ -77,18 +76,6 @@ layoutDecl d@(L loc decl) = case decl of
   InstD _ (ClsInstD _ inst) ->
     withTransformedAnns d $ layoutClsInst (L loc inst)
   _ -> briDocByExactNoComment d
-#else
-layoutDecl d@(L loc decl) = case decl of
-  SigD sig  -> withTransformedAnns d $ layoutSig (L loc sig)
-  ValD bind -> withTransformedAnns d $ layoutBind (L loc bind) >>= \case
-    Left  ns -> docLines $ return <$> ns
-    Right n  -> return n
-  TyClD tycl -> withTransformedAnns d $ layoutTyCl (L loc tycl)
-  InstD (TyFamInstD tfid) ->
-    withTransformedAnns d $ layoutTyFamInstDecl False d tfid
-  InstD (ClsInstD inst) -> withTransformedAnns d $ layoutClsInst (L loc inst)
-  _                    -> briDocByExactNoComment d
-#endif
 
 --------------------------------------------------------------------------------
 -- Sig
@@ -96,16 +83,8 @@ layoutDecl d@(L loc decl) = case decl of
 
 layoutSig :: ToBriDoc Sig
 layoutSig lsig@(L _loc sig) = case sig of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   TypeSig _ names (HsWC _ (HsIB _ typ)) -> layoutNamesAndType Nothing names typ
-#else /* ghc-8.4 */
-  TypeSig names (HsWC _ (HsIB _ typ _)) -> layoutNamesAndType Nothing names typ
-#endif
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   InlineSig _ name (InlinePragma _ spec _arity phaseAct conlike) ->
-#else
-  InlineSig name (InlinePragma _ spec _arity phaseAct conlike) ->
-#endif
     docWrapNode lsig $ do
       nameStr <- lrdrNameToTextAnn name
       specStr <- specStringCompat lsig spec
@@ -122,16 +101,8 @@ layoutSig lsig@(L _loc sig) = case sig of
         $  Text.pack ("{-# " ++ specStr ++ conlikeStr ++ phaseStr)
         <> nameStr
         <> Text.pack " #-}"
-#if MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
   ClassOpSig _ False names (HsIB _ typ) -> layoutNamesAndType Nothing names typ
-#else /* ghc-8.4 */
-  ClassOpSig False names (HsIB _ typ _) -> layoutNamesAndType Nothing names typ
-#endif
-#if MIN_VERSION_ghc(8,6,0)
   PatSynSig _ names (HsIB _ typ) -> layoutNamesAndType (Just "pattern") names typ
-#else
-  PatSynSig names (HsIB _ typ _) -> layoutNamesAndType (Just "pattern") names typ
-#endif
   _ -> briDocByExactNoComment lsig -- TODO
  where
   layoutNamesAndType mKeyword names typ = docWrapNode lsig $ do
@@ -173,16 +144,8 @@ specStringCompat ast = \case
 
 layoutGuardLStmt :: ToBriDoc' (Stmt GhcPs (LHsExpr GhcPs))
 layoutGuardLStmt lgstmt@(L _ stmtLR) = docWrapNode lgstmt $ case stmtLR of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   BodyStmt _ body _ _      -> layoutExpr body
-#else
-  BodyStmt body _ _ _      -> layoutExpr body
-#endif
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   BindStmt _ lPat expr _ _ -> do
-#else
-  BindStmt lPat expr _ _ _ -> do
-#endif
     patDoc <- docSharedWrapper layoutPat lPat
     expDoc <- docSharedWrapper layoutExpr expr
     docCols ColBindStmt
@@ -201,11 +164,7 @@ layoutBind
        (HsBindLR GhcPs GhcPs)
        (Either [BriDocNumbered] BriDocNumbered)
 layoutBind lbind@(L _ bind) = case bind of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   FunBind _ fId (MG _ lmatches@(L _ matches) _) _ [] -> do
-#else
-  FunBind fId (MG lmatches@(L _ matches) _ _ _) _ _ [] -> do
-#endif
     idStr       <- lrdrNameToTextAnn fId
     binderDoc   <- docLit $ Text.pack "="
     funcPatDocs <-
@@ -214,11 +173,7 @@ layoutBind lbind@(L _ bind) = case bind of
         $      layoutPatternBind (Just idStr) binderDoc
         `mapM` matches
     return $ Left $ funcPatDocs
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   PatBind _ pat (GRHSs _ grhss whereBinds) ([], []) -> do
-#else
-  PatBind pat (GRHSs grhss whereBinds) _ _ ([], []) -> do
-#endif
     patDocs    <- colsWrapPat =<< layoutPat pat
     clauseDocs <- layoutGrhs `mapM` grhss
     mWhereDocs <- layoutLocalBinds whereBinds
@@ -233,10 +188,8 @@ layoutBind lbind@(L _ bind) = case bind of
                                                             hasComments
 #if MIN_VERSION_ghc(8,8,0)
   PatSynBind _ (PSB _ patID lpat rpat dir) -> do
-#elif MIN_VERSION_ghc(8,6,0)
-  PatSynBind _ (PSB _ patID lpat rpat dir) -> do
 #else
-  PatSynBind (PSB patID _ lpat rpat dir) -> do
+  PatSynBind _ (PSB _ patID lpat rpat dir) -> do
 #endif
     fmap Right $ docWrapNode lbind $ layoutPatSynBind patID
                                                       lpat
@@ -245,14 +198,9 @@ layoutBind lbind@(L _ bind) = case bind of
   _ -> Right <$> unknownNodeError "" lbind
 layoutIPBind :: ToBriDoc IPBind
 layoutIPBind lipbind@(L _ bind) = case bind of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   XIPBind{} -> unknownNodeError "XIPBind" lipbind
   IPBind _ (Right _) _ -> error "brittany internal error: IPBind Right"
   IPBind _ (Left (L _ (HsIPName name))) expr -> do
-#else
-  IPBind (Right _) _ -> error "brittany internal error: IPBind Right"
-  IPBind (Left (L _ (HsIPName name))) expr -> do
-#endif
     ipName <- docLit $ Text.pack $ '?' : FastString.unpackFS name
     binderDoc <- docLit $ Text.pack "="
     exprDoc <- layoutExpr expr
@@ -274,11 +222,7 @@ layoutLocalBinds lbinds@(L _ binds) = case binds of
   --   Just . (>>= either id return) . Data.Foldable.toList <$> mapBagM layoutBind lhsBindsLR -- TODO: fix ordering
   -- x@(HsValBinds (ValBindsIn{})) ->
   --   Just . (:[]) <$> unknownNodeError "HsValBinds (ValBindsIn _ (_:_))" x
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   HsValBinds _ (ValBinds _ bindlrs sigs) -> do
-#else
-  HsValBinds (ValBindsIn bindlrs sigs) -> do
-#endif
     let unordered =
           [ BagBind b | b <- Data.Foldable.toList bindlrs ]
             ++ [ BagSig s | s <- sigs ]
@@ -287,23 +231,12 @@ layoutLocalBinds lbinds@(L _ binds) = case binds of
       BagBind b -> either id return <$> layoutBind b
       BagSig  s -> return <$> layoutSig s
     return $ Just $ docs
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 --  x@(HsValBinds (ValBindsOut _binds _lsigs)) ->
   HsValBinds _ (XValBindsLR{}) -> error "brittany internal error: XValBindsLR"
   XHsLocalBindsLR{} -> error "brittany internal error: XHsLocalBindsLR"
-#else
-  x@(HsValBinds (ValBindsOut _binds _lsigs)) ->
-    -- i _think_ this case never occurs in non-processed ast
-    Just . (: []) <$> unknownNodeError "HsValBinds ValBindsOut{}"
-                                       (L noSrcSpan x)
-#endif
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   x@(HsIPBinds _ XHsIPBinds{}) ->
     Just . (: []) <$> unknownNodeError "XHsIPBinds" (L noSrcSpan x)
   HsIPBinds _ (IPBinds _ bb) ->
-#else
-  HsIPBinds (IPBinds bb _) ->
-#endif
     Just <$> mapM layoutIPBind bb
   EmptyLocalBinds{} -> return $ Nothing
 
@@ -312,17 +245,11 @@ layoutLocalBinds lbinds@(L _ binds) = case binds of
 layoutGrhs
   :: LGRHS GhcPs (LHsExpr GhcPs)
   -> ToBriDocM ([BriDocNumbered], BriDocNumbered, LHsExpr GhcPs)
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 layoutGrhs lgrhs@(L _ (GRHS _ guards body)) = do
-#else
-layoutGrhs lgrhs@(L _ (GRHS guards body)) = do
-#endif
   guardDocs <- docWrapNode lgrhs $ layoutStmt `mapM` guards
   bodyDoc   <- layoutExpr body
   return (guardDocs, bodyDoc, body)
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
 layoutGrhs (L _ (XGRHS{})) = error "brittany internal error: XGRHS"
-#endif
 
 layoutPatternBind
   :: Maybe Text
@@ -331,19 +258,11 @@ layoutPatternBind
   -> ToBriDocM BriDocNumbered
 layoutPatternBind funId binderDoc lmatch@(L _ match) = do
   let pats                     = m_pats match
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   let (GRHSs _ grhss whereBinds) = m_grhss match
-#else
-  let (GRHSs grhss whereBinds) = m_grhss match
-#endif
   patDocs <- pats `forM` \p -> fmap return $ colsWrapPat =<< layoutPat p
   let isInfix = isInfixMatch match
   mIdStr <- case match of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     Match _ (FunRhs matchId _ _) _ _ -> Just <$> lrdrNameToTextAnn matchId
-#else
-    Match (FunRhs matchId _ _) _ _ -> Just <$> lrdrNameToTextAnn matchId
-#endif
     _ -> pure Nothing
   let mIdStr' = fixPatternBindIdentifier match <$> mIdStr
   patDoc <- docWrapNodePrior lmatch $ case (mIdStr', patDocs) of
@@ -785,11 +704,7 @@ layoutLPatSyn name (RecCon recArgs) = do
 -- pattern synonyms
 layoutPatSynWhere :: HsPatSynDir GhcPs -> ToBriDocM (Maybe [ToBriDocM BriDocNumbered])
 layoutPatSynWhere hs = case hs of
-#if MIN_VERSION_ghc(8,6,0)
   ExplicitBidirectional (MG _ (L _ lbinds) _) -> do
-#else
-  ExplicitBidirectional (MG (L _ lbinds) _ _ _) -> do
-#endif
     binderDoc <- docLit $ Text.pack "="
     Just <$> mapM (docSharedWrapper $ layoutPatternBind Nothing binderDoc) lbinds
   _ -> pure Nothing
@@ -800,17 +715,10 @@ layoutPatSynWhere hs = case hs of
 
 layoutTyCl :: ToBriDoc TyClDecl
 layoutTyCl ltycl@(L _loc tycl) = case tycl of
-#if MIN_VERSION_ghc(8,6,0)
   SynDecl _ name vars fixity typ -> do
     let isInfix = case fixity of
           Prefix -> False
           Infix  -> True
-#else
-  SynDecl name vars fixity typ _ -> do
-    let isInfix = case fixity of
-          Prefix -> False
-          Infix  -> True
-#endif
     -- hasTrailingParen <- hasAnnKeywordComment ltycl AnnCloseP
     -- let parenWrapper = if hasTrailingParen
     --       then appSep . docWrapNodeRest ltycl
@@ -818,11 +726,7 @@ layoutTyCl ltycl@(L _loc tycl) = case tycl of
     let wrapNodeRest = docWrapNodeRest ltycl
     docWrapNodePrior ltycl
       $ layoutSynDecl isInfix wrapNodeRest name (hsq_explicit vars) typ
-#if MIN_VERSION_ghc(8,6,0)
   DataDecl _ext name tyVars _ dataDefn ->
-#else
-  DataDecl name tyVars _ dataDefn _ _ ->
-#endif
     layoutDataDecl ltycl name tyVars dataDefn
   _ -> briDocByExactNoComment ltycl
 
@@ -870,19 +774,11 @@ layoutSynDecl isInfix wrapNodeRest name vars typ = do
 layoutTyVarBndr :: Bool -> ToBriDoc HsTyVarBndr
 layoutTyVarBndr needsSep lbndr@(L _ bndr) = do
   docWrapNodePrior lbndr $ case bndr of
-#if MIN_VERSION_ghc(8,6,0)    /* 8.6 */
     XTyVarBndr{} -> error "brittany internal error: XTyVarBndr"
     UserTyVar _ name -> do
-#else                         /* 8.4 */
-    UserTyVar name -> do
-#endif
       nameStr <- lrdrNameToTextAnn name
       docSeq $ [docSeparator | needsSep] ++ [docLit nameStr]
-#if MIN_VERSION_ghc(8,6,0)    /* 8.6 */
     KindedTyVar _ name kind -> do
-#else                         /* 8.4 */
-    KindedTyVar name kind -> do
-#endif
       nameStr <- lrdrNameToTextAnn name
       docSeq
         $  [ docSeparator | needsSep ]
@@ -913,12 +809,8 @@ layoutTyFamInstDecl inClass outerNode tfid = do
     -- bndrsMay isJust e.g. with
     --   type instance forall a . MyType (Maybe a) = Either () a
     innerNode = outerNode
-#elif MIN_VERSION_ghc(8,6,0)
-    FamEqn _ name pats _fixity typ = hsib_body $ tfid_eqn tfid
-    bndrsMay = Nothing
-    innerNode = outerNode
 #else
-    FamEqn name pats _fixity typ = hsib_body $ tfid_eqn tfid
+    FamEqn _ name pats _fixity typ = hsib_body $ tfid_eqn tfid
     bndrsMay = Nothing
     innerNode = outerNode
 #endif
@@ -996,20 +888,13 @@ layoutClsInst lcid@(L _ cid) = docLines
       .   ClsInstD NoExtField
       .   removeChildren
       <$> lcid
-#elif MIN_VERSION_ghc(8,6,0)    /* 8.6 */
+#else
   layoutInstanceHead =
     briDocByExactNoComment
       $   InstD NoExt
       .   ClsInstD NoExt
       .   removeChildren
       <$> lcid
-#else
-  layoutInstanceHead =
-    briDocByExactNoComment
-      $   InstD
-      .   ClsInstD
-      .   removeChildren
-      <$> lcid
 #endif
 
   removeChildren :: ClsInstDecl p -> ClsInstDecl p
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
index 8c089c2..ae514f1 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs
@@ -44,65 +44,29 @@ layoutExpr lexpr@(L _ expr) = do
     .>  confUnpack
   let allowFreeIndent = indentPolicy == IndentPolicyFree
   docWrapNode lexpr $ case expr of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsVar _ vname -> do
-#else
-    HsVar vname -> do
-#endif
       docLit =<< lrdrNameToTextAnn vname
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsUnboundVar _ var -> case var of
-#else
-    HsUnboundVar var -> case var of
-#endif
       OutOfScope oname _ -> docLit $ Text.pack $ occNameString oname
       TrueExprHole oname -> docLit $ Text.pack $ occNameString oname
     HsRecFld{} -> do
       -- TODO
       briDocByExactInlineOnly "HsRecFld" lexpr
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsOverLabel _ext _reboundFromLabel name ->
-#else                        /* ghc-8.4 */
-    HsOverLabel _reboundFromLabel name ->
-#endif
       let label = FastString.unpackFS name
       in docLit . Text.pack $ '#' : label
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsIPVar _ext (HsIPName name) ->
-#else
-    HsIPVar (HsIPName name) ->
-#endif
       let label = FastString.unpackFS name
       in docLit . Text.pack $ '?' : label
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsOverLit _ olit -> do
-#else
-    HsOverLit olit -> do
-#endif
       allocateNode $ overLitValBriDoc $ ol_val olit
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsLit _ lit -> do
-#else
-    HsLit lit -> do
-#endif
       allocateNode $ litBriDoc lit
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsLam _ (MG _ (L _ [lmatch@(L _ match)]) _)
-#else
-    HsLam (MG (L _ [lmatch@(L _ match)]) _ _ _)
-#endif
       |  pats                  <- m_pats match
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
       ,  GRHSs _ [lgrhs] llocals <- m_grhss match
-#else
-      ,  GRHSs [lgrhs] llocals  <- m_grhss match
-#endif
       ,  L _ EmptyLocalBinds {} <- llocals
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
       ,  L _ (GRHS _ [] body)     <- lgrhs
-#else
-      ,  L _ (GRHS [] body)     <- lgrhs
-#endif
       -> do
       patDocs <- zip (True : repeat False) pats `forM` \(isFirst, p) ->
         fmap return $ do
@@ -168,48 +132,26 @@ layoutExpr lexpr@(L _ expr) = do
         ]
     HsLam{} ->
       unknownNodeError "HsLam too complex" lexpr
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsLamCase _ XMatchGroup{} ->
       error "brittany internal error: HsLamCase XMatchGroup"
-#endif
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsLamCase _ (MG _ (L _ []) _) -> do
-#else                        /* ghc-8.4 */
-    HsLamCase (MG (L _ []) _ _ _) -> do
-#endif
       docSetParSpacing $ docAddBaseY BrIndentRegular $
         (docLit $ Text.pack "\\case {}")
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsLamCase _ (MG _ lmatches@(L _ matches) _) -> do
-#else                        /* ghc-8.4 */
-    HsLamCase (MG lmatches@(L _ matches) _ _ _) -> do
-#endif
       binderDoc   <- docLit $ Text.pack "->"
       funcPatDocs <- docWrapNode lmatches
         $ layoutPatternBind Nothing binderDoc `mapM` matches
       docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar
         (docLit $ Text.pack "\\case")
         (docSetBaseAndIndent $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs)
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsApp _ exp1@(L _ HsApp{}) exp2 -> do
-#else
-    HsApp exp1@(L _ HsApp{}) exp2 -> do
-#endif
       let gather :: [LHsExpr GhcPs] -> LHsExpr GhcPs -> (LHsExpr GhcPs, [LHsExpr GhcPs])
           gather list = \case
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
             L _ (HsApp _ l r) -> gather (r:list) l
-#else
-            L _ (HsApp l r) -> gather (r:list) l
-#endif
             x               -> (x, list)
       let (headE, paramEs) = gather [exp2] exp1
       let colsOrSequence = case headE of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
             L _ (HsVar _ (L _ (Unqual occname))) ->
-#else
-            L _ (HsVar (L _ (Unqual occname))) ->
-#endif
               docCols (ColApp $ Text.pack $ occNameString occname)
             _ -> docSeq
       headDoc <- docSharedWrapper layoutExpr headE
@@ -255,11 +197,7 @@ layoutExpr lexpr@(L _ expr) = do
             ( docNonBottomSpacing
             $ docLines paramDocs
             )
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsApp _ exp1 exp2 -> do
-#else
-    HsApp exp1 exp2 -> do
-#endif
       -- TODO: if expDoc1 is some literal, we may want to create a docCols here.
       expDoc1 <- docSharedWrapper layoutExpr exp1
       expDoc2 <- docSharedWrapper layoutExpr exp2
@@ -301,12 +239,10 @@ layoutExpr lexpr@(L _ expr) = do
     HsAppType _ _ XHsWildCardBndrs{} ->
       error "brittany internal error: HsAppType XHsWildCardBndrs"
     HsAppType _ exp1 (HsWC _ ty1) -> do
-#elif MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
+#else
     HsAppType XHsWildCardBndrs{} _ ->
       error "brittany internal error: HsAppType XHsWildCardBndrs"
     HsAppType (HsWC _ ty1) exp1 -> do
-#else                        /* ghc-8.4 */
-    HsAppType exp1 (HsWC _ ty1) -> do
 #endif
       t <- docSharedWrapper layoutType ty1
       e <- docSharedWrapper layoutExpr exp1
@@ -321,23 +257,10 @@ layoutExpr lexpr@(L _ expr) = do
             e
             (docSeq [docLit $ Text.pack "@", t ])
         ]
-#if !MIN_VERSION_ghc(8,6,0)   /* ghc-8.4 */
-    HsAppTypeOut{} -> do
-      -- TODO
-      briDocByExactInlineOnly "HsAppTypeOut{}" lexpr
-#endif
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     OpApp _ expLeft@(L _ OpApp{}) expOp expRight -> do
-#else
-    OpApp expLeft@(L _ OpApp{}) expOp _ expRight -> do
-#endif
       let gather :: [(LHsExpr GhcPs, LHsExpr GhcPs)] -> LHsExpr GhcPs -> (LHsExpr GhcPs, [(LHsExpr GhcPs, LHsExpr GhcPs)])
           gather opExprList = \case
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
             (L _ (OpApp _ l1 op1 r1)) -> gather ((op1, r1): opExprList) l1
-#else
-            (L _ (OpApp l1 op1 _ r1)) -> gather ((op1, r1): opExprList) l1
-#endif
             final -> (final, opExprList)
           (leftOperand, appList) = gather [] expLeft
       leftOperandDoc <- docSharedWrapper layoutExpr leftOperand
@@ -351,19 +274,11 @@ layoutExpr lexpr@(L _ expr) = do
         hasComLeft <- hasAnyCommentsConnected expLeft
         hasComOp   <- hasAnyCommentsConnected expOp
         pure $ not hasComLeft && not hasComOp
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
       let allowPar = case (expOp, expRight) of
             (L _ (HsVar _ (L _ (Unqual occname))), _)
               | occNameString occname == "$" -> True
             (_, L _ (HsApp _ _ (L _ HsVar{}))) -> False
             _ -> True
-#else
-      let allowPar = case (expOp, expRight) of
-            (L _ (HsVar (L _ (Unqual occname))), _)
-              | occNameString occname == "$" -> True
-            (_, L _ (HsApp _ (L _ HsVar{}))) -> False
-            _ -> True
-#endif
       runFilteredAlternative $ do
         -- > one + two + three
         -- or
@@ -401,27 +316,15 @@ layoutExpr lexpr@(L _ expr) = do
             $ (appListDocs <&> \(od, ed) -> docCols ColOpPrefix [appSep od, docSetBaseY ed])
               ++ [docCols ColOpPrefix [appSep opLastDoc, docSetBaseY expLastDoc]]
             )
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     OpApp _ expLeft expOp expRight -> do
-#else
-    OpApp expLeft expOp _ expRight -> do
-#endif
       expDocLeft  <- docSharedWrapper layoutExpr expLeft
       expDocOp    <- docSharedWrapper layoutExpr expOp
       expDocRight <- docSharedWrapper layoutExpr expRight
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
       let allowPar = case (expOp, expRight) of
             (L _ (HsVar _ (L _ (Unqual occname))), _)
               | occNameString occname == "$" -> True
             (_, L _ (HsApp _ _ (L _ HsVar{}))) -> False
             _ -> True
-#else
-      let allowPar = case (expOp, expRight) of
-            (L _ (HsVar (L _ (Unqual occname))), _)
-              | occNameString occname == "$" -> True
-            (_, L _ (HsApp _ (L _ HsVar{}))) -> False
-            _ -> True
-#endif
       let leftIsDoBlock = case expLeft of
             L _ HsDo{} -> True
             _          -> False
@@ -467,20 +370,12 @@ layoutExpr lexpr@(L _ expr) = do
             then docLines [expDocLeft, expDocOpAndRight]
             else docAddBaseY BrIndentRegular
                    $ docPar expDocLeft expDocOpAndRight
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     NegApp _ op _ -> do
-#else
-    NegApp op _ -> do
-#endif
       opDoc <- docSharedWrapper layoutExpr op
       docSeq [ docLit $ Text.pack "-"
              , opDoc
              ]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsPar _ innerExp -> do
-#else
-    HsPar innerExp -> do
-#endif
       innerExpDoc <- docSharedWrapper (docWrapNode lexpr . layoutExpr) innerExp
       docAlt
         [ docSeq
@@ -496,41 +391,25 @@ layoutExpr lexpr@(L _ expr) = do
           , docLit $ Text.pack ")"
           ]
         ]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     SectionL _ left op -> do -- TODO: add to testsuite
-#else
-    SectionL left op -> do -- TODO: add to testsuite
-#endif
       leftDoc <- docSharedWrapper layoutExpr left
       opDoc   <- docSharedWrapper layoutExpr op
       docSeq [leftDoc, docSeparator, opDoc]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     SectionR _ op right -> do -- TODO: add to testsuite
-#else
-    SectionR op right -> do -- TODO: add to testsuite
-#endif
       opDoc    <- docSharedWrapper layoutExpr op
       rightDoc <- docSharedWrapper layoutExpr right
       docSeq [opDoc, docSeparator, rightDoc]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     ExplicitTuple _ args boxity -> do
-#else
-    ExplicitTuple args boxity -> do
-#endif
 #if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
       let argExprs = args <&> \arg -> case arg of
             (L _ (Present _ e)) -> (arg, Just e);
             (L _ (Missing NoExtField)) -> (arg, Nothing)
             (L _ XTupArg{}) -> error "brittany internal error: XTupArg"
-#elif MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
+#else
       let argExprs = args <&> \arg -> case arg of
             (L _ (Present _ e)) -> (arg, Just e);
             (L _ (Missing NoExt)) -> (arg, Nothing)
             (L _ XTupArg{}) -> error "brittany internal error: XTupArg"
-#else
-      let argExprs = args <&> \arg -> case arg of
-            (L _ (Present e)) -> (arg, Just e);
-            (L _ (Missing PlaceHolder)) -> (arg, Nothing)
 #endif
       argDocs <- forM argExprs
         $ docSharedWrapper
@@ -576,15 +455,9 @@ layoutExpr lexpr@(L _ expr) = do
               lineN = docCols ColTuples [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenP) eN]
               end   = closeLit
             in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN, end]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsCase _ _ XMatchGroup{} ->
       error "brittany internal error: HsCase XMatchGroup"
-#endif
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsCase _ cExp (MG _ (L _ []) _) -> do
-#else
-    HsCase cExp (MG (L _ []) _ _ _) -> do
-#endif
       cExpDoc <- docSharedWrapper layoutExpr cExp
       docAlt
         [ docAddBaseY BrIndentRegular
@@ -599,11 +472,7 @@ layoutExpr lexpr@(L _ expr) = do
             )
             (docLit $ Text.pack "of {}")
         ]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsCase _ cExp (MG _ lmatches@(L _ matches) _) -> do
-#else
-    HsCase cExp (MG lmatches@(L _ matches) _ _ _) -> do
-#endif
       cExpDoc <- docSharedWrapper layoutExpr cExp
       binderDoc <- docLit $ Text.pack "->"
       funcPatDocs <- docWrapNode lmatches
@@ -627,11 +496,7 @@ layoutExpr lexpr@(L _ expr) = do
               (docSetBaseAndIndent $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs)
             )
         ]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsIf _ _ ifExpr thenExpr elseExpr -> do
-#else
-    HsIf _ ifExpr thenExpr elseExpr -> do
-#endif
       ifExprDoc   <- docSharedWrapper layoutExpr ifExpr
       thenExprDoc <- docSharedWrapper layoutExpr thenExpr
       elseExprDoc <- docSharedWrapper layoutExpr elseExpr
@@ -751,11 +616,7 @@ layoutExpr lexpr@(L _ expr) = do
       docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar
         (docLit $ Text.pack "if")
         (layoutPatternBindFinal Nothing binderDoc Nothing clauseDocs Nothing hasComments)
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsLet _ binds exp1 -> do
-#else
-    HsLet binds exp1 -> do
-#endif
       expDoc1     <- docSharedWrapper layoutExpr exp1
       -- We jump through some ugly hoops here to ensure proper sharing.
       hasComments <- hasAnyCommentsBelow lexpr
@@ -861,11 +722,7 @@ layoutExpr lexpr@(L _ expr) = do
             ]
         _ -> docSeq [appSep $ docLit $ Text.pack "let in", expDoc1]
       -- docSeq [appSep $ docLit "let in", expDoc1]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsDo _ stmtCtx (L _ stmts) -> case stmtCtx of
-#else
-    HsDo stmtCtx (L _ stmts) _ -> case stmtCtx of
-#endif
       DoExpr -> do
         stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts
         docSetParSpacing
@@ -960,26 +817,13 @@ layoutExpr lexpr@(L _ expr) = do
             in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end]
     ExplicitList _ _ [] ->
       docLit $ Text.pack "[]"
-#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.4 */
-    ExplicitPArr{} -> do
-      -- TODO
-      briDocByExactInlineOnly "ExplicitPArr{}" lexpr
-#endif
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     RecordCon _ lname fields ->
-#else
-    RecordCon lname _ _ fields ->
-#endif
       case fields of
         HsRecFields fs Nothing -> do
           let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname
           rFs <- fs
             `forM` \lfield@(L _ (HsRecField (L _ fieldOcc) rFExpr pun)) -> do
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
               let FieldOcc _ lnameF = fieldOcc
-#else
-              let FieldOcc lnameF _ = fieldOcc
-#endif
               rFExpDoc <- if pun
                 then return Nothing
                 else Just <$> docSharedWrapper layoutExpr rFExpr
@@ -999,22 +843,14 @@ layoutExpr lexpr@(L _ expr) = do
 #endif
           let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname
           fieldDocs <- fs `forM` \fieldl@(L _ (HsRecField (L _ fieldOcc) fExpr pun)) -> do
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
             let FieldOcc _ lnameF = fieldOcc
-#else
-            let FieldOcc lnameF _ = fieldOcc
-#endif
             fExpDoc <- if pun
               then return Nothing
               else Just <$> docSharedWrapper layoutExpr fExpr
             return (fieldl, lrdrNameToText lnameF, fExpDoc)
           recordExpression True indentPolicy lexpr nameDoc fieldDocs
         _ -> unknownNodeError "RecordCon with puns" lexpr
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     RecordUpd _ rExpr fields -> do
-#else
-    RecordUpd rExpr fields _ _ _ _ -> do
-#endif
       rExprDoc <- docSharedWrapper layoutExpr rExpr
       rFs <- fields
         `forM` \lfield@(L _ (HsRecField (L _ ambName) rFExpr pun)) -> do
@@ -1022,15 +858,10 @@ layoutExpr lexpr@(L _ expr) = do
             then return Nothing
             else Just <$> docSharedWrapper layoutExpr rFExpr
           return $ case ambName of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
             Unambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc)
             Ambiguous   _ n -> (lfield, lrdrNameToText n, rFExpDoc)
             XAmbiguousFieldOcc{} ->
               error "brittany internal error: XAmbiguousFieldOcc"
-#else
-            Unambiguous n _ -> (lfield, lrdrNameToText n, rFExpDoc)
-            Ambiguous   n _ -> (lfield, lrdrNameToText n, rFExpDoc)
-#endif
       recordExpression False indentPolicy lexpr rExprDoc rFs
 #if MIN_VERSION_ghc(8,8,0)   /* ghc-8.6 */
     ExprWithTySig _ _ (HsWC _ XHsImplicitBndrs{}) ->
@@ -1038,14 +869,12 @@ layoutExpr lexpr@(L _ expr) = do
     ExprWithTySig _ _ XHsWildCardBndrs{} ->
       error "brittany internal error: ExprWithTySig XHsWildCardBndrs"
     ExprWithTySig _ exp1 (HsWC _ (HsIB _ typ1)) -> do
-#elif MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
+#else
     ExprWithTySig (HsWC _ XHsImplicitBndrs{}) _ ->
       error "brittany internal error: ExprWithTySig HsWC XHsImplicitBndrs"
     ExprWithTySig XHsWildCardBndrs{} _ ->
       error "brittany internal error: ExprWithTySig XHsWildCardBndrs"
     ExprWithTySig (HsWC _ (HsIB _ typ1)) exp1 -> do
-#else /* ghc-8.4 */
-    ExprWithTySig exp1 (HsWC _ (HsIB _ typ1 _)) -> do
 #endif
       expDoc <- docSharedWrapper layoutExpr exp1
       typDoc <- docSharedWrapper layoutType typ1
@@ -1054,11 +883,6 @@ layoutExpr lexpr@(L _ expr) = do
         , appSep $ docLit $ Text.pack "::"
         , typDoc
         ]
-#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.4 */
-    ExprWithTySigOut{} -> do
-      -- TODO
-      briDocByExactInlineOnly "ExprWithTySigOut{}" lexpr
-#endif
     ArithSeq _ Nothing info ->
       case info of
         From e1 -> do
@@ -1103,11 +927,6 @@ layoutExpr lexpr@(L _ expr) = do
             ]
     ArithSeq{} ->
       briDocByExactInlineOnly "ArithSeq" lexpr
-#if !MIN_VERSION_ghc(8,6,0)  /* ghc-8.4 */
-    PArrSeq{} -> do
-      -- TODO
-      briDocByExactInlineOnly "PArrSeq{}" lexpr
-#endif
     HsSCC{} -> do
       -- TODO
       briDocByExactInlineOnly "HsSCC{}" lexpr
@@ -1123,11 +942,7 @@ layoutExpr lexpr@(L _ expr) = do
     HsTcBracketOut{} -> do
       -- TODO
       briDocByExactInlineOnly "HsTcBracketOut{}" lexpr
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     HsSpliceE _ (HsQuasiQuote _ _ quoter _loc content) -> do
-#else
-    HsSpliceE (HsQuasiQuote _ quoter _loc content) -> do
-#endif
       allocateNode $ BDFPlain
         (Text.pack
           $  "["
@@ -1166,11 +981,7 @@ layoutExpr lexpr@(L _ expr) = do
 #else
     EWildPat{} -> do
       docLit $ Text.pack "_"
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     EAsPat _ asName asExpr -> do
-#else
-    EAsPat asName asExpr -> do
-#endif
       docSeq
         [ docLit $ lrdrNameToText asName <> Text.pack "@"
         , layoutExpr asExpr
@@ -1191,9 +1002,7 @@ layoutExpr lexpr@(L _ expr) = do
     ExplicitSum{} -> do
       -- TODO
       briDocByExactInlineOnly "ExplicitSum{}" lexpr
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     XExpr{} -> error "brittany internal error: XExpr"
-#endif
 
 recordExpression
   :: (Data.Data.Data lExpr, Data.Data.Data name)
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
index 739d138..4f7ec0e 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
@@ -39,32 +39,12 @@ prepareName = ieLWrappedName
 
 layoutIE :: ToBriDoc IE
 layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of
-#if MIN_VERSION_ghc(8,6,0)
   IEVar _ x -> layoutWrapped lie x
-#else
-  IEVar x -> layoutWrapped lie x
-#endif
-#if MIN_VERSION_ghc(8,6,0)
   IEThingAbs _ x -> layoutWrapped lie x
-#else
-  IEThingAbs x -> layoutWrapped lie x
-#endif
-#if MIN_VERSION_ghc(8,6,0)
   IEThingAll _ x -> docSeq [layoutWrapped lie x, docLit $ Text.pack "(..)"]
-#else
-  IEThingAll x -> docSeq [layoutWrapped lie x, docLit $ Text.pack "(..)"]
-#endif
-#if MIN_VERSION_ghc(8,6,0)
   IEThingWith _ x (IEWildcard _) _ _ ->
-#else
-  IEThingWith x (IEWildcard _) _ _ ->
-#endif
     docSeq [layoutWrapped lie x, docLit $ Text.pack "(..)"]
-#if MIN_VERSION_ghc(8,6,0)
   IEThingWith _ x _ ns _ -> do
-#else
-  IEThingWith x _ ns _ -> do
-#endif
     hasComments <- orM
       ( hasCommentsBetween lie AnnOpenP AnnCloseP
       : hasAnyCommentsBelow x
@@ -95,11 +75,7 @@ layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of
         $  [docSeq [docParenLSep, docWrapNode n1 $ nameDoc n1]]
         ++ map layoutItem nMs
         ++ [docSeq [docCommaSep, docNodeAnnKW lie (Just AnnOpenP) $ nameDoc nN], docParenR]
-#if MIN_VERSION_ghc(8,6,0)
   IEModuleContents _ n -> docSeq
-#else
-  IEModuleContents n -> docSeq
-#endif
     [ docLit $ Text.pack "module"
     , docSeparator
     , docLit . Text.pack . moduleNameString $ unLoc n
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs
index ac29eda..cdcd8ed 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs
@@ -37,11 +37,7 @@ prepModName = unLoc
 
 layoutImport :: ToBriDoc ImportDecl
 layoutImport limportD@(L _ importD) = docWrapNode limportD $ case importD of
-#if MIN_VERSION_ghc(8,6,0)
   ImportDecl _ _ (L _ modName) pkg src safe q False mas mllies -> do
-#else
-  ImportDecl _ (L _ modName) pkg src safe q False mas mllies -> do
-#endif
     importCol <- mAsk <&> _conf_layout .> _lconfig_importColumn .> confUnpack
     importAsCol <- mAsk <&> _conf_layout .> _lconfig_importAsColumn .> confUnpack
     indentPolicy <- mAsk <&>  _conf_layout .> _lconfig_indentPolicy .> confUnpack
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
index fb0ba51..037d693 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs
@@ -48,26 +48,16 @@ layoutPat :: LPat GhcPs -> ToBriDocM (Seq BriDocNumbered)
 layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
   WildPat _  -> fmap Seq.singleton $ docLit $ Text.pack "_"
     -- _ -> expr
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   VarPat _ n ->
-#else                        /* ghc-8.4 */
-  VarPat   n ->
-#endif
     fmap Seq.singleton $ docLit $ lrdrNameToText n
     -- abc -> expr
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   LitPat _ lit ->
-#else                        /* ghc-8.4 */
-  LitPat lit ->
-#endif
     fmap Seq.singleton $ allocateNode $ litBriDoc lit
     -- 0 -> expr
 #if MIN_VERSION_ghc(8,8,0)   /* ghc-8.8 */
   ParPat _ inner -> do
-#elif MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
+#else
   ParPat _ inner -> do
-#else                        /* ghc-8.4 */
-  ParPat inner -> do
 #endif
     -- (nestedpat) -> expr
     left  <- docLit $ Text.pack "("
@@ -117,11 +107,7 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
     -- Abc { a, b, c } -> expr2
     let t = lrdrNameToText lname
     fds <- fs `forM` \(L _ (HsRecField (L _ fieldOcc) fPat pun)) -> do
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
       let FieldOcc _ lnameF = fieldOcc
-#else
-      let FieldOcc lnameF _ = fieldOcc
-#endif
       fExpDoc <- if pun
         then return Nothing
         else Just <$> docSharedWrapper layoutPat fPat
@@ -159,11 +145,7 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
     -- Abc { a = locA, .. }
     let t = lrdrNameToText lname
     fds <- fs `forM` \(L _ (HsRecField (L _ fieldOcc) fPat pun)) -> do
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
       let FieldOcc _ lnameF = fieldOcc
-#else
-      let FieldOcc lnameF _ = fieldOcc
-#endif
       fExpDoc <- if pun
         then return Nothing
         else Just <$> docSharedWrapper layoutPat fPat
@@ -181,29 +163,19 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
           (fieldName, Nothing) -> [docLit fieldName, docCommaSep]
       , docLit $ Text.pack "..}"
       ]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   TuplePat _ args boxity -> do
-#else
-  TuplePat args boxity _ -> do
-#endif
     -- (nestedpat1, nestedpat2, nestedpat3) -> expr
     -- (#nestedpat1, nestedpat2, nestedpat3#) -> expr
     case boxity of
       Boxed   -> wrapPatListy args "()" docParenL docParenR
       Unboxed -> wrapPatListy args "(##)" docParenHashLSep docParenHashRSep
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   AsPat _ asName asPat -> do
-#else
-  AsPat asName asPat -> do
-#endif
     -- bind@nestedpat -> expr
     wrapPatPrepend asPat (docLit $ lrdrNameToText asName <> Text.pack "@")
 #if MIN_VERSION_ghc(8,8,0)   /* ghc-8.8 */
   SigPat _ pat1 (HsWC _ (HsIB _ ty1)) -> do
-#elif MIN_VERSION_ghc(8,6,0) /* ghc-8.6 */
+#else
   SigPat (HsWC _ (HsIB _ ty1)) pat1 -> do
-#else                        /* ghc-8.4 */
-  SigPatIn pat1 (HsWC _ (HsIB _ ty1 _)) -> do
 #endif
     -- i :: Int -> expr
     patDocs <- layoutPat pat1
@@ -224,33 +196,17 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of
           , docForceSingleline tyDoc
           ]
         return $ xR Seq.|> xN'
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   ListPat _ elems ->
-#else
-  ListPat elems _ _ ->
-#endif
     -- [] -> expr1
     -- [nestedpat1, nestedpat2, nestedpat3] -> expr2
     wrapPatListy elems "[]" docBracketL docBracketR
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   BangPat _ pat1 -> do
-#else
-  BangPat pat1 -> do
-#endif
     -- !nestedpat -> expr
     wrapPatPrepend pat1 (docLit $ Text.pack "!")
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   LazyPat _ pat1 -> do
-#else
-  LazyPat pat1 -> do
-#endif
     -- ~nestedpat -> expr
     wrapPatPrepend pat1 (docLit $ Text.pack "~")
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   NPat _ llit@(L _ ol) mNegative _ -> do
-#else
-  NPat llit@(L _ ol) mNegative _ _ -> do
-#endif
     -- -13 -> expr
     litDoc <- docWrapNode llit $ allocateNode $ overLitValBriDoc $ GHC.ol_val ol
     negDoc <- docLit $ Text.pack "-"
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs
index 60ba54b..5427d7a 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs
@@ -38,17 +38,9 @@ layoutStmt lstmt@(L _ stmt) = do
   indentAmount :: Int <-
     mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack
   docWrapNode lstmt $ case stmt of
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     LastStmt _ body False _ -> do
-#else
-    LastStmt body False _ -> do
-#endif
       layoutExpr body
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     BindStmt _ lPat expr _ _ -> do
-#else
-    BindStmt lPat expr _ _ _ -> do
-#endif
       patDoc <- fmap return $ colsWrapPat =<< layoutPat lPat
       expDoc <- docSharedWrapper layoutExpr expr
       docAlt
@@ -67,11 +59,7 @@ layoutStmt lstmt@(L _ stmt) = do
             $ docPar (docLit $ Text.pack "<-") (expDoc)
           ]
         ]
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     LetStmt _ binds -> do
-#else
-    LetStmt binds -> do
-#endif
       let isFree         = indentPolicy == IndentPolicyFree
       let indentFourPlus = indentAmount >= 4
       layoutLocalBinds binds >>= \case
@@ -116,11 +104,7 @@ layoutStmt lstmt@(L _ stmt) = do
             $ docAddBaseY BrIndentRegular
             $ docPar (docLit $ Text.pack "let")
                      (docSetBaseAndIndent $ docLines $ return <$> bindDocs)
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     RecStmt _ stmts _ _ _ _ _ -> runFilteredAlternative $ do
-#else
-    RecStmt stmts _ _ _ _ _ _ _ _ _ -> runFilteredAlternative $ do
-#endif
       -- rec stmt1
       --     stmt2
       --     stmt3
@@ -136,11 +120,7 @@ layoutStmt lstmt@(L _ stmt) = do
       addAlternative $ docAddBaseY BrIndentRegular $ docPar
         (docLit (Text.pack "rec"))
         (docLines $ layoutStmt <$> stmts)
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
     BodyStmt _ expr _ _ -> do
-#else
-    BodyStmt expr _ _ _ -> do
-#endif
       expDoc <- docSharedWrapper layoutExpr expr
       docAddBaseY BrIndentRegular $ expDoc
     _ -> briDocByExactInlineOnly "some unknown statement" lstmt
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
index a2b55d7..3437fcd 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs
@@ -42,16 +42,12 @@ import           DataTreePrint
 layoutType :: ToBriDoc HsType
 layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
   -- _ | traceShow (ExactPrint.Types.mkAnnKey ltype) False -> error "impossible"
-#if MIN_VERSION_ghc(8,6,0)
   HsTyVar _ promoted name -> do
-#else   /* ghc-8.4 */
-  HsTyVar promoted name -> do
-#endif
     t <- lrdrNameToTextAnnTypeEqualityIsSpecial name
     case promoted of
 #if MIN_VERSION_ghc(8,8,0)
       IsPromoted -> docSeq
-#else /* ghc-8.4 8.6 */
+#else /* ghc-8.6 */
       Promoted -> docSeq
 #endif
         [ docSeparator
@@ -61,10 +57,8 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
       NotPromoted -> docWrapNode name $ docLit t
 #if MIN_VERSION_ghc(8,10,1)
   HsForAllTy _ _ bndrs (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do
-#elif MIN_VERSION_ghc(8,6,0)
-  HsForAllTy _ bndrs (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do
 #else
-  HsForAllTy bndrs (L _ (HsQualTy (L _ cntxts) typ2)) -> do
+  HsForAllTy _ bndrs (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do
 #endif
     typeDoc <- docSharedWrapper layoutType typ2
     tyVarDocs <- layoutTyVarBndrs bndrs
@@ -153,10 +147,8 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
       ]
 #if MIN_VERSION_ghc(8,10,1)
   HsForAllTy _ _ bndrs typ2 -> do
-#elif MIN_VERSION_ghc(8,6,0)
-  HsForAllTy _ bndrs typ2 -> do
 #else
-  HsForAllTy bndrs typ2 -> do
+  HsForAllTy _ bndrs typ2 -> do
 #endif
     typeDoc <- layoutType typ2
     tyVarDocs <- layoutTyVarBndrs bndrs
@@ -212,11 +204,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
             ]
           )
       ]
-#if MIN_VERSION_ghc(8,6,0)
   HsQualTy _ lcntxts@(L _ cntxts) typ1 -> do
-#else
-  HsQualTy lcntxts@(L _ cntxts) typ1 -> do
-#endif
     typeDoc <- docSharedWrapper layoutType typ1
     cntxtDocs <- cntxts `forM` docSharedWrapper layoutType
     let
@@ -266,11 +254,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
             ]
           )
       ]
-#if MIN_VERSION_ghc(8,6,0)
   HsFunTy _ typ1 typ2 -> do
-#else
-  HsFunTy typ1 typ2 -> do
-#endif
     typeDoc1 <- docSharedWrapper layoutType typ1
     typeDoc2 <- docSharedWrapper layoutType typ2
     let maybeForceML = case typ2 of
@@ -294,11 +278,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
           ]
         )
       ]
-#if MIN_VERSION_ghc(8,6,0)
   HsParTy _ typ1 -> do
-#else
-  HsParTy typ1 -> do
-#endif
     typeDoc1 <- docSharedWrapper layoutType typ1
     docAlt
       [ docSeq
@@ -313,7 +293,6 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
             ])
           (docLit $ Text.pack ")")
       ]
-#if MIN_VERSION_ghc(8,6,0)
   HsAppTy _ typ1@(L _ HsAppTy{}) typ2 -> do
     let gather :: [LHsType GhcPs] -> LHsType GhcPs -> (LHsType GhcPs, [LHsType GhcPs])
         gather list = \case
@@ -341,65 +320,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
           typeDoc1
           (docEnsureIndent BrIndentRegular typeDoc2)
       ]
-#else
-  HsAppTy typ1 typ2 -> do
-    typeDoc1 <- docSharedWrapper layoutType typ1
-    typeDoc2 <- docSharedWrapper layoutType typ2
-    docAlt
-      [ docSeq
-        [ docForceSingleline typeDoc1
-        , docSeparator
-        , docForceSingleline typeDoc2
-        ]
-      , docPar
-          typeDoc1
-          (docEnsureIndent BrIndentRegular typeDoc2)
-      ]
-  HsAppsTy [] -> error "HsAppsTy []"
-  HsAppsTy [L _ (HsAppPrefix typ1)] -> do
-    typeDoc1 <- docSharedWrapper layoutType typ1
-    typeDoc1
-  HsAppsTy [lname@(L _ (HsAppInfix name))] -> do
-    -- this redirection is somewhat hacky, but whatever.
-    -- TODO: a general problem when doing deep inspections on
-    --       the type (and this is not the only instance)
-    --       is that we potentially omit annotations on some of
-    --       the middle constructors. i have no idea under which
-    --       circumstances exactly important annotations (comments)
-    --       would be assigned to such constructors.
-    typeDoc1 <- -- docSharedWrapper layoutType $ (L l $ HsTyVar name)
-      lrdrNameToTextAnnTypeEqualityIsSpecialAndRespectTick lname name
-    docLit typeDoc1
-  HsAppsTy (L _ (HsAppPrefix typHead):typRestA)
-    | Just typRest <- mapM (\case L _ (HsAppPrefix t) -> Just t
-                                  _ -> Nothing) typRestA -> do
-    docHead <- docSharedWrapper layoutType typHead
-    docRest <- docSharedWrapper layoutType `mapM` typRest
-    docAlt
-      [ docSeq
-      $ docForceSingleline docHead : (docRest >>= \d ->
-        [ docSeparator, docForceSingleline d ])
-      , docPar docHead (docLines $ docEnsureIndent BrIndentRegular <$> docRest)
-      ]
-  HsAppsTy (typHead:typRest) -> do
-    docHead <- docSharedWrapper layoutAppType typHead
-    docRest <- docSharedWrapper layoutAppType `mapM` typRest
-    docAlt
-      [ docSeq
-      $ docForceSingleline docHead : (docRest >>= \d ->
-        [ docSeparator, docForceSingleline d ])
-      , docPar docHead (docLines $ docEnsureIndent BrIndentRegular <$> docRest)
-      ]
-    where
-      layoutAppType (L _ (HsAppPrefix t)) = layoutType t
-      layoutAppType lt@(L _ (HsAppInfix t)) =
-        docLit =<< lrdrNameToTextAnnTypeEqualityIsSpecialAndRespectTick lt t
-#endif
-#if MIN_VERSION_ghc(8,6,0)
   HsListTy _ typ1 -> do
-#else
-  HsListTy typ1 -> do
-#endif
     typeDoc1 <- docSharedWrapper layoutType typ1
     docAlt
       [ docSeq
@@ -414,29 +335,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
             ])
           (docLit $ Text.pack "]")
       ]
-#if MIN_VERSION_ghc(8,6,0)
-#else
-  HsPArrTy typ1 -> do
-    typeDoc1 <- docSharedWrapper layoutType typ1
-    docAlt
-      [ docSeq
-        [ docWrapNodeRest ltype $ docLit $ Text.pack "[:"
-        , docForceSingleline typeDoc1
-        , docLit $ Text.pack ":]"
-        ]
-      , docPar
-          ( docCols ColTyOpPrefix
-            [ docWrapNodeRest ltype $ docLit $ Text.pack "[:"
-            , docAddBaseY (BrIndentSpecial 2) $ typeDoc1
-            ])
-          (docLit $ Text.pack ":]")
-      ]
-#endif
-#if MIN_VERSION_ghc(8,6,0)
   HsTupleTy _ tupleSort typs -> case tupleSort of
-#else
-  HsTupleTy tupleSort typs -> case tupleSort of
-#endif
     HsUnboxedTuple           -> unboxed
     HsBoxedTuple             -> simple
     HsConstraintTuple        -> simple
@@ -539,11 +438,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
   --               }
   --     , _layouter_ast = ltype
   --     }
-#if MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
   HsIParamTy _ (L _ (HsIPName ipName)) typ1 -> do
-#else                        /* ghc-8.4 */
-  HsIParamTy (L _ (HsIPName ipName)) typ1 -> do
-#endif
     typeDoc1 <- docSharedWrapper layoutType typ1
     docAlt
       [ docSeq
@@ -562,33 +457,8 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
             , docAddBaseY (BrIndentSpecial 2) typeDoc1
             ])
       ]
-#if MIN_VERSION_ghc(8,6,0)
-#else
-  HsEqTy typ1 typ2 -> do
-    typeDoc1 <- docSharedWrapper layoutType typ1
-    typeDoc2 <- docSharedWrapper layoutType typ2
-    docAlt
-      [ docSeq
-        [ docForceSingleline typeDoc1
-        , docWrapNodeRest ltype
-        $ docLit $ Text.pack " ~ "
-        , docForceSingleline typeDoc2
-        ]
-      , docPar
-          typeDoc1
-          ( docCols ColTyOpPrefix
-              [ docWrapNodeRest ltype
-              $ docLit $ Text.pack "~ "
-              , docAddBaseY (BrIndentSpecial 2) typeDoc2
-              ])
-      ]
-#endif
   -- TODO: test KindSig
-#if MIN_VERSION_ghc(8,6,0)
   HsKindSig _ typ1 kind1 -> do
-#else
-  HsKindSig typ1 kind1 -> do
-#endif
     typeDoc1 <- docSharedWrapper layoutType typ1
     kindDoc1 <- docSharedWrapper layoutType kind1
     hasParens <- hasAnnKeyword ltype AnnOpenP
@@ -738,32 +608,22 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of
       ]
   HsExplicitTupleTy{} -> -- TODO
     briDocByExactInlineOnly "HsExplicitTupleTy{}" ltype
-#if MIN_VERSION_ghc(8,6,0)
   HsTyLit _ lit -> case lit of
-#else
-  HsTyLit lit -> case lit of
-#endif
     HsNumTy (SourceText srctext) _ -> docLit $ Text.pack srctext
     HsNumTy NoSourceText _ ->
       error "overLitValBriDoc: literal with no SourceText"
     HsStrTy (SourceText srctext) _ -> docLit $ Text.pack srctext
     HsStrTy NoSourceText _ ->
       error "overLitValBriDoc: literal with no SourceText"
-#if !MIN_VERSION_ghc(8,6,0)
-  HsCoreTy{} -> -- TODO
-    briDocByExactInlineOnly "HsCoreTy{}" ltype
-#endif
   HsWildCardTy _ ->
     docLit $ Text.pack "_"
   HsSumTy{} -> -- TODO
     briDocByExactInlineOnly "HsSumTy{}" ltype
-#if MIN_VERSION_ghc(8,6,0)
   HsStarTy _ isUnicode -> do
     if isUnicode
       then docLit $ Text.pack "\x2605" -- Unicode star
       else docLit $ Text.pack "*"
   XHsType{} -> error "brittany internal error: XHsType"
-#endif
 #if MIN_VERSION_ghc(8,8,0)
   HsAppKindTy _ ty kind -> do
     t <- docSharedWrapper layoutType ty
@@ -785,18 +645,11 @@ layoutTyVarBndrs
   :: [LHsTyVarBndr GhcPs]
   -> ToBriDocM [(Text, Maybe (ToBriDocM BriDocNumbered))]
 layoutTyVarBndrs = mapM $ \case
-#if MIN_VERSION_ghc(8,6,0)
   (L _ (UserTyVar _ name)) -> return $ (lrdrNameToText name, Nothing)
   (L _ (KindedTyVar _ lrdrName kind)) -> do
     d <- docSharedWrapper layoutType kind
     return $ (lrdrNameToText lrdrName, Just $ d)
   (L _ (XTyVarBndr{})) -> error "brittany internal error: XTyVarBndr"
-#else
-  (L _ (UserTyVar name)) -> return $ (lrdrNameToText name, Nothing)
-  (L _ (KindedTyVar lrdrName kind)) -> do
-    d <- docSharedWrapper layoutType kind
-    return $ (lrdrNameToText lrdrName, Just $ d)
-#endif
 
 -- there is no specific reason this returns a list instead of a single
 -- BriDoc node.
diff --git a/src/Language/Haskell/Brittany/Internal/Prelude.hs b/src/Language/Haskell/Brittany/Internal/Prelude.hs
index e9a6979..b33e339 100644
--- a/src/Language/Haskell/Brittany/Internal/Prelude.hs
+++ b/src/Language/Haskell/Brittany/Internal/Prelude.hs
@@ -407,7 +407,7 @@ todo = error "todo"
 #if MIN_VERSION_ghc(8,8,0)
 ghcDL :: GHC.HasSrcSpan a => a -> GHC.Located (GHC.SrcSpanLess a)
 ghcDL = GHC.dL
-#else              /* ghc-8.4 8.6 */
+#else              /* ghc-8.6 */
 ghcDL :: GHC.Located a -> GHC.Located a
 ghcDL x = x
 #endif
diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs
index 4b4061e..5ee7ed2 100644
--- a/src/Language/Haskell/Brittany/Internal/Utils.hs
+++ b/src/Language/Haskell/Brittany/Internal/Utils.hs
@@ -304,11 +304,8 @@ lines' s = case break (== '\n') s of
 #if MIN_VERSION_ghc(8,10,1)   /* ghc-8.10.1 */
 absurdExt :: HsExtension.NoExtCon -> a
 absurdExt = HsExtension.noExtCon
-#elif MIN_VERSION_ghc(8,6,0)   /* ghc-8.6 */
+#else
 -- | A method to dismiss NoExt patterns for total matches
 absurdExt :: HsExtension.NoExt -> a
 absurdExt = error "cannot construct NoExt"
-#else
-absurdExt :: ()
-absurdExt = ()
 #endif
diff --git a/stack-8.4.3.yaml b/stack-8.4.3.yaml
deleted file mode 100644
index f925568..0000000
--- a/stack-8.4.3.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-resolver: lts-12.12
-
-extra-deps:
-  - ghc-exactprint-0.5.8.1
diff --git a/stack-8.4.3.yaml.lock b/stack-8.4.3.yaml.lock
deleted file mode 100644
index b4a4818..0000000
--- a/stack-8.4.3.yaml.lock
+++ /dev/null
@@ -1,19 +0,0 @@
-# This file was autogenerated by Stack.
-# You should not edit this file by hand.
-# For more information, please see the documentation at:
-#   https://docs.haskellstack.org/en/stable/lock_files
-
-packages:
-- completed:
-    hackage: ghc-exactprint-0.5.8.1@sha256:f76eed0976b854ce03928796e9cff97769e304618ca99bc0f6cdccab31e539d0,7728
-    pantry-tree:
-      size: 83871
-      sha256: 14febc191ef8b0d1f218d13e8db9ed20395f10a5b3d8aa2c0d45869a037420a2
-  original:
-    hackage: ghc-exactprint-0.5.8.1
-snapshots:
-- completed:
-    size: 504336
-    url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/12/12.yaml
-    sha256: 11db5c37144d13fe6b56cd511050b4e6ffe988f6edb8e439c2432fc9fcdf50c3
-  original: lts-12.12

From 7dedb0c17de82afb8c4653416b63c8afeedc9d63 Mon Sep 17 00:00:00 2001
From: Taylor Fausak <taylor@fausak.me>
Date: Sun, 15 Nov 2020 12:07:41 -0500
Subject: [PATCH 13/13] Test against GHC 8.10

---
 .github/workflows/ci.yaml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index ae70751..d87e8d9 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -20,6 +20,9 @@ jobs:
         cabal:
           - 3.2.0.0
         include:
+          - os: ubuntu-18.04
+            ghc: 8.10.2
+            cabal: 3.2.0.0
           - os: ubuntu-18.04
             ghc: 8.6.5
             cabal: 3.2.0.0