diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 0.3.1
+
+- Support GHC-8.6.5...9.10.1
+
 ## 0.3
 
 - Breaking change:
diff --git a/src/Data/TreeDiff/Class.hs b/src/Data/TreeDiff/Class.hs
--- a/src/Data/TreeDiff/Class.hs
+++ b/src/Data/TreeDiff/Class.hs
@@ -1,14 +1,12 @@
 {-# LANGUAGE CPP                 #-}
 {-# LANGUAGE ConstraintKinds     #-}
 {-# LANGUAGE DefaultSignatures   #-}
+{-# LANGUAGE EmptyCase           #-}
 {-# LANGUAGE FlexibleContexts    #-}
 {-# LANGUAGE GADTs               #-}
 {-# LANGUAGE RankNTypes          #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeOperators       #-}
-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 708
-{-# LANGUAGE EmptyCase           #-}
-#endif
 -- | A 'ToExpr' class.
 module Data.TreeDiff.Class (
     ediff,
@@ -20,10 +18,9 @@
     GToExpr,
     ) where
 
-import Data.Foldable    (toList)
-import Data.List        (sort)
-import Data.List.Compat (uncons)
-import Data.Proxy       (Proxy (..))
+import Data.Foldable (toList)
+import Data.List     (sort, uncons)
+import Data.Proxy    (Proxy (..))
 import GHC.Generics
        (Constructor (..), Generic (..), K1 (..), M1 (..), Selector (..),
        U1 (..), V1, (:*:) (..), (:+:) (..))
@@ -43,10 +40,6 @@
 import Data.Word
 import Numeric.Natural       (Natural)
 
-#ifdef MIN_VERSION_generic_deriving
-import Generics.Deriving.Instances ()
-#endif
-
 import qualified Data.Monoid    as Mon
 import qualified Data.Ratio     as Ratio
 import qualified Data.Semigroup as Semi
@@ -94,11 +87,9 @@
 import qualified Data.HashSet        as HS
 
 -- aeson
-import qualified Data.Aeson as Aeson
-#if MIN_VERSION_aeson(2,0,0)
+import qualified Data.Aeson        as Aeson
 import qualified Data.Aeson.Key    as Key
 import qualified Data.Aeson.KeyMap as KM
-#endif
 
 -- strict
 import qualified Data.Strict as Strict
@@ -107,11 +98,7 @@
 import Data.These (These (..))
 
 -- primitive
-import qualified Data.Primitive as Prim
-
-#if MIN_VERSION_base(4,9,0)
-import Data.Array.Byte (ByteArray (..))
-#endif
+import qualified Data.Primitive  as Prim
 
 -- $setup
 -- >>> :set -XDeriveGeneric
@@ -202,11 +189,7 @@
     gsumToExpr (R1 x) = gsumToExpr x
 
 instance GSumToExpr V1 where
-#if __GLASGOW_HASKELL__ >= 708
     gsumToExpr x = case x of {}
-#else
-    gsumToExpr x = x `seq` error "panic: V1 value"
-#endif
 
 instance (Constructor c, GProductToExpr f) => GSumToExpr (M1 i c f) where
     gsumToExpr z@(M1 x) = case gproductToExpr x of
@@ -561,13 +544,11 @@
 
 instance ToExpr Aeson.Value
 
-#if MIN_VERSION_aeson(2,0,0)
 instance ToExpr Key.Key where
     toExpr = stringToExpr "Key.concat" . unconcat T.uncons . Key.toText
 
 instance ToExpr a => ToExpr (KM.KeyMap a) where
     toExpr x = App "KM.fromList" [ toExpr $ KM.toList x ]
-#endif
 
 -------------------------------------------------------------------------------
 -- strict
@@ -601,11 +582,3 @@
 -- | @since 0.2.2
 instance ToExpr Prim.ByteArray where
     toExpr ba = App "Prim.byteArrayFromList" [toExpr (Prim.foldrByteArray (:) [] ba :: [Word8])]
-
-#if !MIN_VERSION_primitive(0,8,0) && MIN_VERSION_base(4,9,0)
--- | @since 0.2.2
-instance ToExpr ByteArray where
-    toExpr (ByteArray ba) = App "byteArrayFromList" [toExpr (Prim.foldrByteArray (:) [] (Prim.ByteArray ba) :: [Word8])]
-#endif
-
--- TODO: add more instances
diff --git a/src/Data/TreeDiff/Expr.hs b/src/Data/TreeDiff/Expr.hs
--- a/src/Data/TreeDiff/Expr.hs
+++ b/src/Data/TreeDiff/Expr.hs
@@ -9,9 +9,6 @@
     exprDiff,
     ) where
 
-import Prelude ()
-import Prelude.Compat
-
 import Control.DeepSeq (NFData (..))
 import Data.Semialign  (alignWith)
 import Data.These      (These (..))
diff --git a/src/Data/TreeDiff/Golden.hs b/src/Data/TreeDiff/Golden.hs
--- a/src/Data/TreeDiff/Golden.hs
+++ b/src/Data/TreeDiff/Golden.hs
@@ -4,8 +4,6 @@
 ) where
 
 import Data.TreeDiff
-import Prelude ()
-import Prelude.Compat
 import System.Console.ANSI (SGR (Reset), setSGRCode)
 import Text.Parsec         (eof, parse)
 import Text.Parsec.Text ()
diff --git a/src/Data/TreeDiff/OMap.hs b/src/Data/TreeDiff/OMap.hs
--- a/src/Data/TreeDiff/OMap.hs
+++ b/src/Data/TreeDiff/OMap.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP           #-}
 {-# LANGUAGE DeriveFunctor #-}
 -- | Map which remembers the 'fromList' order.
 -- This module is minimal on purpose.
@@ -15,18 +14,13 @@
     elems,
 ) where
 
-import Data.List      (sortBy)
-import Data.Ord       (comparing)
-import Data.Semialign (Semialign (..))
-import Data.These     (These (..))
-import Control.DeepSeq  (NFData (..))
+import Control.DeepSeq (NFData (..))
+import Data.List       (sortBy)
+import Data.Ord        (comparing)
+import Data.Semialign  (Semialign (..))
+import Data.These      (These (..))
 
-#if MIN_VERSION_containers(0,5,0)
 import qualified Data.Map.Strict as Map
-#else
-import qualified Data.Map as Map
-#endif
-
 import qualified Test.QuickCheck as QC
 
 -- $setup
diff --git a/src/Data/TreeDiff/Parser.hs b/src/Data/TreeDiff/Parser.hs
--- a/src/Data/TreeDiff/Parser.hs
+++ b/src/Data/TreeDiff/Parser.hs
@@ -8,8 +8,6 @@
 
 import Control.Applicative (many, optional, (<|>))
 import Data.Char           (chr, isAlphaNum, isPunctuation, isSymbol)
-import Prelude ()
-import Prelude.Compat
 
 import Text.Parser.Char            (CharParsing (anyChar, char, satisfy))
 import Text.Parser.Combinators     (between, (<?>))
diff --git a/src/Data/TreeDiff/Pretty.hs b/src/Data/TreeDiff/Pretty.hs
--- a/src/Data/TreeDiff/Pretty.hs
+++ b/src/Data/TreeDiff/Pretty.hs
@@ -28,7 +28,7 @@
 import Data.Either        (partitionEithers)
 import Data.TreeDiff.Expr
 import Numeric            (showHex)
-import Text.Read.Compat   (readMaybe)
+import Text.Read          (readMaybe)
 
 import qualified Data.TreeDiff.OMap           as OMap
 import qualified Text.PrettyPrint             as HJ
diff --git a/tests/Tests.hs b/tests/Tests.hs
--- a/tests/Tests.hs
+++ b/tests/Tests.hs
@@ -1,21 +1,15 @@
-{-# LANGUAGE CPP           #-}
 {-# LANGUAGE DeriveGeneric #-}
 module Main (main) where
 
+import Data.Array.Byte            (ByteArray (..))
 import Data.Proxy                 (Proxy (..))
 import Data.Word                  (Word8)
 import GHC.Generics               (Generic)
-import Prelude ()
-import Prelude.Compat
 import Test.QuickCheck            (Property, counterexample, (===))
 import Test.Tasty                 (TestTree, defaultMain, testGroup)
 import Test.Tasty.Golden.Advanced (goldenTest)
 import Test.Tasty.QuickCheck      (testProperty)
 
-#if MIN_VERSION_base(4,9,0)
-import Data.Array.Byte (ByteArray (..))
-#endif
-
 import qualified Data.HashSet                 as HS
 import qualified Data.Primitive               as Prim
 import qualified Text.Parsec                  as P
@@ -161,9 +155,7 @@
 -- test that we have both instances.
 data ByteArrays = ByteArrays
     Prim.ByteArray
-#if MIN_VERSION_base(4,9,0)
     ByteArray
-#endif
   deriving Generic
 
 instance ToExpr ByteArrays
diff --git a/tree-diff.cabal b/tree-diff.cabal
--- a/tree-diff.cabal
+++ b/tree-diff.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.2
 name:               tree-diff
-version:            0.3.0.1
+version:            0.3.1
 synopsis:           Diffing of (expression) trees.
 category:           Data, Testing
 description:
@@ -44,21 +44,15 @@
   README.md
 
 tested-with:
-    GHC ==7.4.2
-     || ==7.6.3
-     || ==7.8.4
-     || ==7.10.3
-     || ==8.0.2
-     || ==8.2.2
-     || ==8.4.4
-     || ==8.6.5
-     || ==8.8.4
-     || ==8.10.7
-     || ==9.0.2
-     || ==9.2.7
-     || ==9.4.4
-     || ==9.6.1
-  , GHCJS ==8.4
+  GHC ==8.6.5
+   || ==8.8.4
+   || ==8.10.7
+   || ==9.0.2
+   || ==9.2.8
+   || ==9.4.8
+   || ==9.6.5
+   || ==9.8.2
+   || ==9.10.1
 
 extra-source-files:
   fixtures/exfoo.expr
@@ -86,51 +80,34 @@
 
   -- GHC boot libraries
   build-depends:
-    , base        >=4.5       && <4.19
-    , bytestring  ^>=0.9.2.1  || ^>=0.10.0.2 || ^>=0.11.0.0
-    , containers  ^>=0.4.2.1  || ^>=0.5.0.0  || ^>=0.6.0.1
-    , deepseq     ^>=1.3.0.0  || ^>=1.4.0.0
+    , base        >=4.12.0.0  && <4.21
+    , bytestring  ^>=0.10.8.2 || ^>=0.11.0.0 || ^>=0.12.0.2
+    , containers  ^>=0.6.0.1  || ^>=0.7
+    , deepseq     ^>=1.4.4.0  || ^>=1.5.0.0
     , parsec      ^>=3.1.13.0
     , pretty      ^>=1.1.1.0
-    , text        ^>=1.2.3.0  || ^>=2.0
-    , time        >=1.4       && <1.5        || >=1.5.0.1   && <1.6 || >=1.6.0.1 && <1.7 || >=1.8.0.2 && <1.9 || >=1.9.3 && <1.13
+    , text        ^>=1.2.3.0  || ^>=2.0      || ^>=2.1
+    , time        ^>=1.8.0.2  || ^>=1.9.3    || ^>=1.10     || ^>=1.11 || ^>=1.12
 
   build-depends:
-    , aeson                 ^>=1.4.6.0    || ^>=1.5.6.0  || ^>=2.0.0.0 || ^>=2.1.0.0
-    , ansi-terminal         >=0.10        && <0.12
-    , ansi-wl-pprint        ^>=0.6.8.2
-    , base-compat           >=0           && <0.13       || ^>=0.13
-    , bytestring-builder    ^>=0.10.8.2.0
-    , hashable              ^>=1.2.7.0    || ^>=1.3.0.0  || ^>=1.4.0.1
-    , parsers               ^>=0.12.10
-    , primitive             >=0.7.1.0     && <0.8        || ^>=0.8
-    , QuickCheck            ^>=2.14.2
-    , scientific            ^>=0.3.6.2
-    , semialign             >=1.2.0.1     && <1.3        || ^>=1.3
-    , strict                >=0.4.0.1     && <0.5        || ^>=0.5
-    , tagged                ^>=0.8.6
-    , these                 >=1.1.1.1     && <1.2        || ^>=1.2
-    , unordered-containers  ^>=0.2.8.0
-    , uuid-types            ^>=1.0.3
-    , vector                ^>=0.12.0.0   || ^>=0.13.0.0
-
-  if impl(ghc <7.5)
-    build-depends: ghc-prim
-
-  if !impl(ghc >=8.0)
-    build-depends: semigroups >=0.19.1 && <0.21
-
-  if !impl(ghc >=7.8)
-    build-depends: generic-deriving >=1.13.1 && <1.15
-
-  if !impl(ghc >=7.10)
-    build-depends:
-      , nats          ^>=1.1.2
-      , transformers  ^>=0.3.0.0 || ^>=0.4.2.0 || >=0.5.2.0 && <0.6 || ^>=0.6
-      , void          ^>=0.7.3
+    , aeson                 ^>=2.2.0.0
+    , ansi-terminal         ^>=1.1
+    , ansi-wl-pprint        ^>=1.0.2
+    , hashable              ^>=1.4.4.0
+    , parsers               ^>=0.12.11
+    , primitive             ^>=0.9.0.0
+    , QuickCheck            ^>=2.14.2   || ^>=2.15
+    , scientific            ^>=0.3.8.0
+    , semialign             ^>=1.3.1
+    , strict                ^>=0.5
+    , tagged                ^>=0.8.8
+    , these                 ^>=1.2.1
+    , unordered-containers  ^>=0.2.20
+    , uuid-types            ^>=1.0.6
+    , vector                ^>=0.13.1.0
 
   if (impl(ghc >=8) && !impl(ghc >=9.4))
-    build-depends: data-array-byte >=0.1.0.1 && <0.2
+    build-depends: data-array-byte ^>=0.1.0.1
 
   other-extensions:
     CPP
@@ -158,7 +135,6 @@
     , ansi-terminal
     , ansi-wl-pprint
     , base
-    , base-compat
     , parsec
     , primitive
     , QuickCheck
@@ -174,11 +150,10 @@
 
   -- extra dependencies
   build-depends:
-    , tasty             ^>=1.2     || ^>=1.3.1 || ^>=1.4.2
-    , tasty-golden      ^>=2.3.1.1
-    , tasty-quickcheck  ^>=0.10.1
-    , trifecta          >=2        && <2.2
-
+    , tasty             ^>=1.5
+    , tasty-golden      ^>=2.3.5
+    , tasty-quickcheck  ^>=0.10.3
+    , trifecta          ^>=2.1.4
 
 benchmark tree-diff-bench
   default-language: Haskell2010
@@ -195,5 +170,5 @@
 
   -- extra dependencies
   build-depends:
-    , criterion  ^>=1.6.0.0
-    , Diff       ^>=0.4.0
+    , criterion  ^>=1.6.3.0
+    , Diff       ^>=0.5
