diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,7 @@
+0.3.2 [2024.12.04]
+------------------
+* Drop support for pre-8.0 versions of GHC.
+
 0.3.1 [2021-01-04]
 ------------------
 * Downgraded testing claims that NaNs will round-trip, as 32-bit GHCs aren't fulfilling that promise.
diff --git a/half.cabal b/half.cabal
--- a/half.cabal
+++ b/half.cabal
@@ -1,6 +1,6 @@
 cabal-version: >=1.10
 name: half
-version: 0.3.1
+version: 0.3.2
 license: BSD3
 license-file: LICENSE
 copyright: Copyright (C) 2014 Edward A. Kmett
@@ -19,16 +19,19 @@
     README.markdown
     CHANGELOG.markdown
 
-tested-with:   GHC == 7.4.2
-             , GHC == 7.6.3
-             , GHC == 7.8.4
-             , GHC == 7.10.3
-             , GHC == 8.0.2
+tested-with:   GHC == 8.0.2
              , GHC == 8.2.2
              , GHC == 8.4.4
              , GHC == 8.6.5
              , GHC == 8.8.4
-             , GHC == 8.10.3
+             , GHC == 8.10.7
+             , GHC == 9.0.2
+             , GHC == 9.2.8
+             , GHC == 9.4.8
+             , GHC == 9.6.6
+             , GHC == 9.8.4
+             , GHC == 9.10.1
+             , GHC == 9.12.1
 
 source-repository head
     type: git
@@ -41,33 +44,19 @@
         Numeric.Half.Internal
     hs-source-dirs: src
     other-extensions: BangPatterns CPP DeriveDataTypeable DeriveGeneric
-                      ForeignFunctionInterface
-    ghc-options: -Wall -fwarn-tabs -O2
+                      DeriveLift ForeignFunctionInterface PatternSynonyms
+                      StandaloneDeriving
+    ghc-options: -Wall -Wtabs -O2 -Wno-missing-pattern-synonym-signatures
     build-depends:
-        base >=4.5 && <5,
+        base >=4.9 && <5,
         binary >=0.5.1.0 && <0.9,
-        deepseq >=1.3.0.0 && <1.5,
-        template-haskell
+        deepseq >=1.4.2.0 && <1.6,
+        template-haskell >=2.11
 
     if !impl(ghcjs)
       c-sources:
         cbits/half.c
 
-    if impl(ghc >= 8.0)
-        other-extensions: DeriveLift StandaloneDeriving
-    else
-        other-extensions: TemplateHaskell
-
-    if impl(ghc >=7.8)
-        other-extensions: PatternSynonyms
-
-    if impl(ghc <7.6)
-        build-depends:
-            ghc-prim
-
-    if impl(ghc >=8)
-        ghc-options: -Wno-missing-pattern-synonym-signatures
-
 test-suite spec
     default-language: Haskell2010
     type: exitcode-stdio-1.0
@@ -80,6 +69,6 @@
         binary,
         bytestring,
         half,
-        QuickCheck >=2.14.1 && <2.15,
+        QuickCheck >=2.14.1 && <2.16,
         test-framework,
         test-framework-quickcheck2
diff --git a/src/Numeric/Half.hs b/src/Numeric/Half.hs
--- a/src/Numeric/Half.hs
+++ b/src/Numeric/Half.hs
@@ -1,8 +1,5 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE Safe #-}
-#if __GLASGOW_HASKELL__ >= 708
 {-# LANGUAGE PatternSynonyms          #-}
-#endif
 
 -----------------------------------------------------------------------------
 -- |
@@ -23,8 +20,6 @@
   , fromHalf
   , toHalf
   -- * Patterns
-  -- | These are available with GHC-7.8 and later.
-#if __GLASGOW_HASKELL__ >= 708
   , pattern POS_INF
   , pattern NEG_INF
   , pattern QNaN
@@ -36,7 +31,6 @@
   , pattern HALF_DIG
   , pattern HALF_MIN_10_EXP
   , pattern HALF_MAX_10_EXP
-#endif
   ) where
 
 import Numeric.Half.Internal
diff --git a/src/Numeric/Half/Internal.hs b/src/Numeric/Half/Internal.hs
--- a/src/Numeric/Half/Internal.hs
+++ b/src/Numeric/Half/Internal.hs
@@ -1,22 +1,11 @@
 {-# LANGUAGE BangPatterns             #-}
 {-# LANGUAGE CPP                      #-}
-{-# LANGUAGE DeriveDataTypeable       #-}
 {-# LANGUAGE DeriveGeneric            #-}
 {-# LANGUAGE ForeignFunctionInterface #-}
-#if __GLASGOW_HASKELL__ >= 800
 {-# LANGUAGE TemplateHaskellQuotes    #-}
-#else
-{-# LANGUAGE TemplateHaskell          #-}
-#endif
-#if __GLASGOW_HASKELL__ >= 708
 {-# LANGUAGE PatternSynonyms          #-}
-#endif
 {-# LANGUAGE Trustworthy              #-}
 
-#ifndef MIN_VERSION_base
-#define MIN_VERSION_base(x,y,z) 1
-#endif
-
 -----------------------------------------------------------------------------
 -- |
 -- Copyright   :  (C) 2014 Edward Kmett
@@ -36,8 +25,6 @@
   , fromHalf
   , toHalf
   -- * Patterns
-  -- | These are available with GHC-7.8 and later.
-#if __GLASGOW_HASKELL__ >= 708
   , pattern POS_INF
   , pattern NEG_INF
   , pattern QNaN
@@ -49,7 +36,6 @@
   , pattern HALF_DIG
   , pattern HALF_MIN_10_EXP
   , pattern HALF_MAX_10_EXP
-#endif
   -- * Pure conversions
   , pure_floatToHalf
   , pure_halfToFloat
@@ -59,19 +45,13 @@
 import Data.Bits
 import Data.Function (on)
 import Data.Int
-import Data.Typeable
 import Foreign.C.Types (CUShort (..))
 import Foreign.Ptr (castPtr)
 import Foreign.Storable
 import GHC.Generics
-#ifdef WITH_TEMPLATE_HASKELL
-#endif
 import Text.Read (Read (..))
 
 import Language.Haskell.TH.Syntax (Lift (..))
-#if __GLASGOW_HASKELL__ < 800
-import Language.Haskell.TH
-#endif
 
 import Data.Binary (Binary (..))
 
@@ -91,18 +71,13 @@
 -- {-# RULES "fromHalf" realToFrac = fromHalf #-}
 #endif
 
+-- | A half-precision floating point value
 newtype
-#if __GLASGOW_HASKELL__ >= 706
   {-# CTYPE "unsigned short" #-}
-#endif
-  Half = Half { getHalf :: CUShort } deriving (Generic, Typeable)
+  Half = Half { getHalf :: CUShort } deriving Generic
 
 instance NFData Half where
-#if MIN_VERSION_deepseq(1,4,0)
   rnf (Half f) = rnf f
-#else
-  rnf (Half f) = f `seq` ()
-#endif
 
 instance Binary Half where
   put (Half (CUShort w)) = put w
@@ -188,8 +163,6 @@
 isZero :: Half -> Bool
 isZero (Half h) = h .&. 0x7fff == 0
 
-#if __GLASGOW_HASKELL__ >= 708
-
 -- | Positive infinity
 pattern POS_INF = Half 0x7c00
 
@@ -217,14 +190,12 @@
 -- | Number of base 10 digits that can be represented without change
 pattern HALF_DIG = 2
 
--- Minimum positive integer such that 10 raised to that power is a normalized half
+-- | Minimum positive integer such that 10 raised to that power is a normalized half
 pattern HALF_MIN_10_EXP = -4
 
--- Maximum positive integer such that 10 raised to that power is a normalized half
+-- | Maximum positive integer such that 10 raised to that power is a normalized half
 pattern HALF_MAX_10_EXP = 4
 
-#endif
-
 instance Num Half where
   a * b = toHalf (fromHalf a * fromHalf b)
   a - b = toHalf (fromHalf a - fromHalf b)
@@ -234,17 +205,10 @@
   signum = toHalf . signum . fromHalf
   fromInteger a = toHalf (fromInteger a)
 
-#if __GLASGOW_HASKELL__ >= 800
 instance Lift Half where
   lift (Half (CUShort w)) = [| Half (CUShort w) |]
 #if MIN_VERSION_template_haskell(2,16,0)
   liftTyped (Half (CUShort w)) = [|| Half (CUShort w) ||]
-#endif
-#else
-instance Lift Half where
-  lift (Half (CUShort w)) =
-    appE (conE 'Half) . appE (conE 'CUShort) . litE . integerL . fromIntegral $
-    w
 #endif
 
 -- Adapted from ghc/rts/StgPrimFloat.c
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -1,9 +1,5 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
-#if __GLASGOW_HASKELL__ >= 708 && __GLASGOW_HASKELL__ < 710
-{-# LANGUAGE PatternSynonyms #-}
-#endif
-{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
 
 import Numeric.Half
 import Numeric.Half.Internal
@@ -74,7 +70,6 @@
       isInfinite snan === False
     ]
 
-#if __GLASGOW_HASKELL__ >= 708
   , testGroup "Patterns"
     [ testProperty "QNaN" $ case qnan of
         QNaN -> True
@@ -89,7 +84,6 @@
         NEG_INF -> True
         _    -> False
     ]
-#endif
 
   -- With GHCJS these tests are trivially true.
   , testGroup "Native fromHalf against C version"
@@ -148,7 +142,7 @@
 prop_to_half i = let
   ref = getHalf $ toHalf i
   imp = getHalf $ pure_floatToHalf i
-  in ref == imp
+  in (ref == imp) || (isNaN (Half ref) && isNaN (Half imp))
 
 -- cover all range of Half(not Float)
 list1 :: [Float]
@@ -156,11 +150,15 @@
   r1 = filter (not . isNaN) $ map (fromHalf . Half) [0 .. 65535]
   r2 = sort $ filter (not . isInfinite) $ filter (>= 0) r1
   r3 = r2 ++ [last r2 + 2 ** 11]
-  r4 = zipWith (\a b -> let d = (b - a) / 4
-                        in [a, a + d, a + d * 2, a + d * 3])
-               r3 (tail r3)
+  r4 = zipWithTail (\a b -> let d = (b - a) / 4
+                            in [a, a + d, a + d * 2, a + d * 3])
+                   r3
   r5 = concat r4 ++ [last r3]
   in r5
+
+zipWithTail :: (a -> a -> b) -> [a] -> [b]
+zipWithTail _ [] = []
+zipWithTail f xs@(_:xss) = zipWith f xs xss
 
 list2 :: [Float]
 list2 = map negate list1
