diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,8 @@
+0.3.12 [2025.03.03]
+-------------------
+* Support building with `containers-0.8.*`.
+* Drop support for pre-`0.4.2.0` versions of `containers`.
+
 0.3.11 [2024.12.04]
 -------------------
 * Drop support for pre-8.0 versions of GHC.
diff --git a/charset.cabal b/charset.cabal
--- a/charset.cabal
+++ b/charset.cabal
@@ -1,5 +1,5 @@
 name:          charset
-version:       0.3.11
+version:       0.3.12
 license:       BSD3
 license-File:  LICENSE
 copyright:     (c) Edward Kmett 2010-2012
@@ -42,7 +42,7 @@
     base                 >= 4.9     && < 5,
     array                >= 0.2     && < 0.6,
     bytestring           >= 0.9     && < 0.13,
-    containers           >= 0.2     && < 0.8,
+    containers           >= 0.4.2.0 && < 0.9,
     unordered-containers >= 0.1.4.6 && < 0.3
 
   exposed-modules:
diff --git a/src/Data/CharSet.hs b/src/Data/CharSet.hs
--- a/src/Data/CharSet.hs
+++ b/src/Data/CharSet.hs
@@ -227,7 +227,7 @@
 {-# INLINE notMember #-}
 
 fold :: (Char -> b -> b) -> b -> CharSet -> b
-fold f z (CharSet True _ i) = I.fold (f . toEnum) z i
+fold f z (CharSet True _ i) = I.foldr (f . toEnum) z i
 fold f z (CharSet False _ i) = foldr f z $ P.filter (\x -> fromEnum x `I.notMember` i) [ul..uh]
 {-# INLINE fold #-}
 
