diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,36 +1,44 @@
-See also http://pvp.haskell.org/faq
+### 0.2.1.5
 
+_2025-03-11, Andreas Abel_
+
+* Drop support for old dependencies predating LTS 7.24 (GHC 8.0).
+* Relax bound on `containers`.
+* Tested with GHC 8.0 - 9.12.1.
+
 ### 0.2.1.4
 
-_2024-04-25_
+_2024-04-25, Andreas Abel_
 
-* Drop support for GHC 7
-* Testsuite: relax lower bounds to accommodate LTS 11.22 (GHC 8.2) for new Stack CI
-* Tested with GHC 8.0 - 9.10.0 (alpha3)
+* Drop support for GHC 7.
+* Testsuite: relax lower bounds to accommodate LTS 11.22 (GHC 8.2) for new Stack CI.
+* Tested with GHC 8.0 - 9.10.0 (alpha3).
 
 ### 0.2.1.3
 
-_2023-10-14_
+_2023-10-14, Andreas Abel_
 
-* Pacify `x-partial` warning of GHC 9.8
-* Tested with GHC 7.10 - 9.8.1
+* Pacify `x-partial` warning of GHC 9.8.
+* Tested with GHC 7.10 - 9.8.1.
 
 ### 0.2.1.2
 
-_2023-09-29_
+_2023-09-29, Andreas Abel_
 
 * Add `default-extensions: TypeOperators` to silence warning under GHC ≥ 9.4.
 * Support latest versions of dependencies.
-* Tested with GHC 7.10 - 9.8.0
+* Tested with GHC 7.10 - 9.8.0.
 
 ### 0.2.1.1
 
-_2022-05-11_
+_2022-05-11, Andreas Abel_
 
-* Compatibility with `mtl-2.3`
-* Tested with GHC 7.4 - 9.2
+* Compatibility with `mtl-2.3`.
+* Tested with GHC 7.4 - 9.2.
 
 ### 0.2.1.0
+
+_2019-10-06, Herbert Valerio Riedel_
 
 * Define `Functor Doc` instance ([#33](https://github.com/haskell-hvr/HsYAML/issues/33))
 * New `withScalar` function and also define `ToYAML Scalar` and `FromYAML Scalar` instances
diff --git a/HsYAML.cabal b/HsYAML.cabal
--- a/HsYAML.cabal
+++ b/HsYAML.cabal
@@ -1,6 +1,6 @@
 cabal-version:       1.14
 name:                HsYAML
-version:             0.2.1.4
+version:             0.2.1.5
 
 synopsis:            Pure Haskell YAML 1.2 processor
 homepage:            https://github.com/haskell-hvr/HsYAML
@@ -15,9 +15,10 @@
 category:            Text
 build-type:          Simple
 tested-with:
-  GHC == 9.10.0
-  GHC == 9.8.2
-  GHC == 9.6.5
+  GHC == 9.12.1
+  GHC == 9.10.1
+  GHC == 9.8.4
+  GHC == 9.6.6
   GHC == 9.4.8
   GHC == 9.2.8
   GHC == 9.0.2
@@ -90,14 +91,16 @@
                        Trustworthy
                        TypeSynonymInstances
 
-  build-depends:       base         >= 4.9      && < 5
-                     , bytestring   >= 0.9      && < 0.13
-                     , containers   >= 0.4.2    && < 0.8
-                     , deepseq      >= 1.3.0    && < 1.6
-                     , text         >= 1.2.3    && < 2.2
-                     , mtl          >= 2.2.1    && < 2.4
-                     , parsec       >= 3.1.13.0 && < 3.2
-                     , transformers >= 0.4      && < 0.7
+  build-depends:
+    -- Lower bounds chosen from LTS-7.24 (GHC 8.0.1)
+      base         >= 4.9      && < 5
+    , bytestring   >= 0.10.8.1 && < 0.13
+    , containers   >= 0.5.7.1  && < 1
+    , deepseq      >= 1.4.2.0  && < 1.6
+    , text         >= 1.2.3    && < 2.2
+    , mtl          >= 2.2.1    && < 2.4
+    , parsec       >= 3.1.13.0 && < 3.2
+    , transformers >= 0.5.2.0  && < 0.7
 
   ghc-options:
     -Wall
@@ -113,7 +116,7 @@
   if flag(exe)
     build-depends: HsYAML
                    -- inherited constraints
-                 , bytestring >= 0.10.8.0
+                 , bytestring
                  , base
                  , text
                  , containers
@@ -147,4 +150,4 @@
                    -- lower bounds chosen from lts-11.22 (GHC 8.2)
                  , QuickCheck       >= 2.10.1   && < 2.16
                  , tasty            >= 1.0.1.1  && < 1.6
-                 , tasty-quickcheck >= 0.9.2    && < 0.11
+                 , tasty-quickcheck >= 0.9.2    && < 1
diff --git a/src/Util.hs b/src/Util.hs
--- a/src/Util.hs
+++ b/src/Util.hs
@@ -42,11 +42,7 @@
 import           Data.Map                     as X (Map)
 import qualified Data.Map                     as Map
 import           Data.Monoid                  as X (Monoid (mappend, mempty))
-#if MIN_VERSION_base(4,9,0)
 import           Data.Semigroup               ((<>))
-#else
-import           Data.Monoid                  ((<>))
-#endif
 import qualified Data.ByteString              as BS
 import qualified Data.ByteString.Lazy         as BS.L
 import           Data.Set                     as X (Set)
@@ -64,26 +60,6 @@
 liftEither' = either throwError return
 
 
-#if !MIN_VERSION_base(4,6,0)
-
--- | Parse a string using the 'Read' instance. Succeeds if there is
--- exactly one valid result.
-readMaybe :: Read a => String -> Maybe a
-readMaybe = either (const Nothing) id . readEither
-
--- | Parse a string using the 'Read' instance. Succeeds if there is
--- exactly one valid result. A 'Left' value indicates a parse error.
-readEither :: Read a => String -> Either String a
-readEither s = case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of
-                 [x] -> Right x
-                 []  -> Left "Prelude.read: no parse"
-                 _   -> Left "Prelude.read: ambiguous parse"
- where
-  read' = do x <- readPrec
-             Text.Read.lift P.skipSpaces
-             return x
-#endif
-
 -- | Succeeds if the 'Integral' value is in the bounds of the given Data type.
 -- 'Nothing' indicates that the value is outside the bounds.
 fromIntegerMaybe :: forall n . (Integral n, Bounded n) => Integer -> Maybe n
@@ -115,8 +91,4 @@
 -- O(n) Convert a lazy 'BS.L.ByteString' into a strict 'BS.ByteString'.
 {-# INLINE bsToStrict #-}
 bsToStrict :: BS.L.ByteString -> BS.ByteString
-#if MIN_VERSION_bytestring(0,10,0)
 bsToStrict = BS.L.toStrict
-#else
-bsToStrict = BS.concat . BS.L.toChunks
-#endif
