diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+0.2.3.0
+
+* Drop support for pre-8.0 versions of GHC.
+
 0.2.2.0
 
 * Supporting building with all AArch64 platforms (not just Linux and macOS).
diff --git a/criterion-measurement.cabal b/criterion-measurement.cabal
--- a/criterion-measurement.cabal
+++ b/criterion-measurement.cabal
@@ -1,5 +1,5 @@
 name:                criterion-measurement
-version:             0.2.2.0
+version:             0.2.3.0
 synopsis:            Criterion measurement functionality and associated types
 description:         Measurement-related functionality extracted from Criterion, with minimal dependencies. The rationale for this is to enable alternative analysis front-ends.
 homepage:            https://github.com/haskell/criterion
@@ -13,10 +13,6 @@
 extra-source-files:  README.md, changelog.md
 cabal-version:       >=1.10
 tested-with:
-  GHC==7.4.2,
-  GHC==7.6.3,
-  GHC==7.8.4,
-  GHC==7.10.3,
   GHC==8.0.2,
   GHC==8.2.2,
   GHC==8.4.4,
@@ -24,9 +20,11 @@
   GHC==8.8.4,
   GHC==8.10.7,
   GHC==9.0.2,
-  GHC==9.2.7,
-  GHC==9.4.5,
-  GHC==9.6.1
+  GHC==9.2.8,
+  GHC==9.4.8,
+  GHC==9.6.6,
+  GHC==9.8.2,
+  GHC==9.10.1
 
 flag fast
   description: compile without optimizations
@@ -38,19 +36,17 @@
   exposed-modules:     Criterion.Measurement
                        Criterion.Measurement.Types
                        Criterion.Measurement.Types.Internal
-  build-depends:       aeson >= 0.8
-                     , base >= 4.5 && < 5
+  build-depends:       aeson >= 2 && < 2.3
+                     , base >= 4.9 && < 5
                      , base-compat >= 0.9
-                     , binary >= 0.5.1.0
+                     , binary >= 0.8.3.0
                      , containers
                      , deepseq >= 1.1.0.0
-                     , ghc-prim
+                     , ghc-prim >= 0.5
                      , vector >= 0.7.1
 
   default-language: Haskell2010
-  ghc-options: -Wall -funbox-strict-fields
-  if impl(ghc >= 6.8)
-    ghc-options: -fwarn-tabs
+  ghc-options: -Wall -funbox-strict-fields -Wtabs
   if flag(fast)
     ghc-options: -O0
   else
diff --git a/src/Criterion/Measurement.hs b/src/Criterion/Measurement.hs
--- a/src/Criterion/Measurement.hs
+++ b/src/Criterion/Measurement.hs
@@ -37,7 +37,7 @@
 import Criterion.Measurement.Types (Benchmarkable(..), Measured(..))
 import Control.DeepSeq (NFData(rnf))
 import Control.Exception (finally,evaluate)
-import Data.Data (Data, Typeable)
+import Data.Data (Data)
 import Data.Int (Int64)
 import Data.List (unfoldr)
 import Data.Word (Word64)
@@ -49,20 +49,12 @@
 #endif
 import Prelude ()
 import Prelude.Compat
-#if MIN_VERSION_base(4,7,0)
 import System.Mem (performGC, performMinorGC)
-# else
-import System.Mem (performGC)
-#endif
 import Text.Printf (printf)
 import qualified Control.Exception as Exc
 import qualified Data.Vector as V
 import qualified GHC.Stats as Stats
 
-#if !(MIN_VERSION_base(4,7,0))
-foreign import ccall "performGC" performMinorGC :: IO ()
-#endif
-
 -- | Statistics about memory usage and the garbage collector. Apart from
 -- 'gcStatsCurrentBytesUsed' and 'gcStatsCurrentBytesSlop' all are cumulative values since
 -- the program started.
@@ -111,7 +103,7 @@
     , gcStatsCpuSeconds :: !Double
     -- | Total wall clock time elapsed since start
     , gcStatsWallSeconds :: !Double
-    } deriving (Eq, Read, Show, Typeable, Data, Generic)
+    } deriving (Eq, Read, Show, Data, Generic)
 
 -- | Try to get GC statistics, bearing in mind that the GHC runtime
 -- will throw an exception if statistics collection was not enabled
diff --git a/src/Criterion/Measurement/Types.hs b/src/Criterion/Measurement/Types.hs
--- a/src/Criterion/Measurement/Types.hs
+++ b/src/Criterion/Measurement/Types.hs
@@ -68,7 +68,7 @@
 import Criterion.Measurement.Types.Internal (fakeEnvironment, nf', whnf')
 import Data.Aeson (FromJSON(..), ToJSON(..))
 import Data.Binary (Binary(..))
-import Data.Data (Data, Typeable)
+import Data.Data (Data)
 import Data.Int (Int64)
 import Data.Map (Map, fromList)
 import GHC.Generics (Generic)
@@ -146,7 +146,7 @@
     , measGcCpuSeconds       :: !Double
       -- ^ __(GC)__ CPU time spent doing garbage collection.  Access
       -- using 'fromDouble'.
-    } deriving (Eq, Read, Show, Typeable, Data, Generic)
+    } deriving (Eq, Read, Show, Data, Generic)
 
 instance FromJSON Measured where
     parseJSON v = do
diff --git a/src/Criterion/Measurement/Types/Internal.hs b/src/Criterion/Measurement/Types/Internal.hs
--- a/src/Criterion/Measurement/Types/Internal.hs
+++ b/src/Criterion/Measurement/Types/Internal.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE BangPatterns #-}
-{-# LANGUAGE CPP #-}
 
 -- Ensure that nf' and whnf' are always optimized, even if
 -- criterion-measurement is compiled with -O0 or -fprof-auto (see #184).
@@ -27,12 +26,7 @@
 
 import Data.Int (Int64)
 import Control.Exception
-
-#if MIN_VERSION_ghc_prim(0,3,1)
 import GHC.Types (SPEC(..))
-#else
-import GHC.Exts (SpecConstrAnnotation(..))
-#endif
 
 -- | A dummy environment that is passed to functions that create benchmarks
 -- from environments when no concrete environment is available.
@@ -98,8 +92,3 @@
          _ <- evaluate (f x)
          go SPEC (n-1)
 {-# NOINLINE whnf' #-}
-
-#if !(MIN_VERSION_ghc_prim(0,3,1))
-data SPEC = SPEC | SPEC2
-{-# ANN type SPEC ForceSpecConstr #-}
-#endif
