diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Changelog for qrcode-core
 
+## 0.9.12 -- 2026-10-27
+
+* Support for containers-0.8
+
 ## 0.9.11 -- 2026-02-04
 
 * Support for bytestring-0.12
diff --git a/qrcode-core.cabal b/qrcode-core.cabal
--- a/qrcode-core.cabal
+++ b/qrcode-core.cabal
@@ -1,13 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.38.1.
+-- This file has been generated from package.yaml by hpack version 0.39.6.
 --
 -- see: https://github.com/sol/hpack
---
--- hash: 220e36d212e9f77cf8dec6a975e39f53f05f406f216d2df3ef7c19c2a7650c9e
 
 name:           qrcode-core
-version:        0.9.11
+version:        0.9.12
 synopsis:       QR code library in pure Haskell
 description:    Please see the README on GitHub at <https://github.com/alexkazik/qrcode/qrcode-core#readme>
 category:       codec
@@ -18,9 +16,9 @@
 copyright:      2018 ALeX Kazik
 license:        MIT
 license-file:   LICENSE
+build-type:     Simple
 tested-with:
     GHC == 7.10.3, GHC == 8.0.1, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.3, GHC == 8.4.4, GHC == 8.6.3, GHC == 8.6.4, GHC == 8.6.5, GHC == 8.8.2, GHC == 8.8.3, GHC == 8.10.1, GHC == 8.10.7, GHC == 9.4.4, GHC == 9.4.5
-build-type:     Simple
 extra-source-files:
     README.md
     ChangeLog.md
@@ -70,7 +68,7 @@
     , binary >=0.7.5.0 && <0.9
     , bytestring >=0.10.6.0 && <0.13
     , case-insensitive >=1.2.0.5 && <1.3
-    , containers >=0.5.6.2 && <0.8
+    , containers >=0.5.6.2 && <0.9
     , dlist >=0.7.1.2 && <1.1
     , primitive >=0.6.1.0 && <0.10
     , text >=1.2.2.0 && <2.2
diff --git a/src/Codec/QRCode/Code/Intermediate.hs b/src/Codec/QRCode/Code/Intermediate.hs
--- a/src/Codec/QRCode/Code/Intermediate.hs
+++ b/src/Codec/QRCode/Code/Intermediate.hs
@@ -39,7 +39,7 @@
   img1 <- MI.new v e
   -- draw all function modules
   drawFunctionPatterns img1
-  -- convert the image, now the information wether an module is for data or function can't be changed anymore
+  -- convert the image, now the information whether an module is for data or function can't be changed anymore
   img2 <- MI.unsafeConvert img1
   -- draw the image
   drawCodeWords img2 (BSB.toBitStream bs)
diff --git a/src/Codec/QRCode/Data/ByteStreamBuilder.hs b/src/Codec/QRCode/Data/ByteStreamBuilder.hs
--- a/src/Codec/QRCode/Data/ByteStreamBuilder.hs
+++ b/src/Codec/QRCode/Data/ByteStreamBuilder.hs
@@ -66,7 +66,7 @@
         fromIntegral (b `shiftR` (n-8)) : go (n-8) b xs
     go n _ ((n', b'):xs)
       | n == 0 && n' == 8 =
-        fromIntegral b' : go 0 0 xs -- short circut if we have currently 0 bits and the next chunk contains 8 bits
+        fromIntegral b' : go 0 0 xs -- short circuit if we have currently 0 bits and the next chunk contains 8 bits
     go n b ((n', b'):xs) =
       go (n+n') ((b `shiftL` n') .|. b') xs -- maximum leftover: 7, maximum new bits: 22, result is < 30 bits (what a Int can store at least)
     go _ _ [] = []
diff --git a/src/Codec/QRCode/Mode/Mixed.hs b/src/Codec/QRCode/Mode/Mixed.hs
--- a/src/Codec/QRCode/Mode/Mixed.hs
+++ b/src/Codec/QRCode/Mode/Mixed.hs
@@ -94,7 +94,7 @@
         tyc = typeOfChar ci c
         oc = ord c
       in
-        if tyc == T8Bit && (oc < 0 || oc >= 256) -- in case of numeric, aplhanumeric or kanji it's aready proven that it's a valid char
+        if tyc == T8Bit && (oc < 0 || oc >= 256) -- in case of numeric, aplhanumeric or kanji it's already proven that it's a valid char
           then empty
           else pure (tyc, S 1 1 (DL.singleton c))
 
