diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,8 @@
 # Changelog
 
+- 0.1.2 (2024-12-15)
+  * Minor performance improvements.
+
 - 0.1.1 (2024-12-14)
   * Simply improves generated Haddocks.
 
diff --git a/bench/Main.hs b/bench/Main.hs
--- a/bench/Main.hs
+++ b/bench/Main.hs
@@ -7,6 +7,7 @@
 
 import Criterion.Main
 import qualified Data.ByteString as BS
+import qualified Data.ByteString.Base32 as Base32
 import qualified Data.ByteString.Bech32 as Bech32
 import GHC.Generics
 import qualified Reference.Bech32 as R
@@ -20,24 +21,34 @@
     suite
   ]
 
+base32 :: Benchmark
+base32 = bgroup "base32 encode" [
+    bench "120b" $ nf Base32.encode "jtobin was here"
+  , bench "128b (non 40-bit multiple length)" $
+      nf Base32.encode "jtobin was here!"
+  , bench "240b" $ nf Base32.encode "jtobin was herejtobin was here"
+  ]
+
+bech32 :: Benchmark
+bech32 = bgroup "bech32 encode" [
+    bench "120b" $ nf (Bech32.encode "bc") "jtobin was here"
+  , bench "128b (non 40-bit multiple length)" $
+      nf (Bech32.encode "bc") "jtobin was here!"
+  , bench "240b" $ nf (Bech32.encode "bc") "jtobin was herejtobin was here"
+  ]
+
 suite :: Benchmark
 suite = env setup $ \ ~(a, b, c) -> bgroup "benchmarks" [
       bgroup "ppad-bech32" [
-        bgroup "bech32" [
-            bench "120b" $ whnf (Bech32.encode "bc")
-              "jtobin was here"
-          , bench "128b (non 40-bit multiple length)" $ whnf (Bech32.encode "bc")
-              "jtobin was here!"
-          , bench "240b" $ whnf (Bech32.encode "bc")
-              "jtobin was herejtobin was here"
-        ]
+          base32
+        , bech32
       ]
     , bgroup "reference" [
         bgroup "bech32" [
-            bench "120b" $ whnf (R.bech32Encode "bc") a
+            bench "120b" $ nf (R.bech32Encode "bc") a
           , bench "128b (non 40-bit multiple length)" $
-              whnf (R.bech32Encode "bc") b
-          , bench "240b" $ whnf (R.bech32Encode "bc") c
+              nf (R.bech32Encode "bc") b
+          , bench "240b" $ nf (R.bech32Encode "bc") c
         ]
       ]
     ]
diff --git a/lib/Data/ByteString/Base32.hs b/lib/Data/ByteString/Base32.hs
--- a/lib/Data/ByteString/Base32.hs
+++ b/lib/Data/ByteString/Base32.hs
@@ -44,6 +44,7 @@
 toStrict :: BSB.Builder -> BS.ByteString
 toStrict = BS.toStrict
   . BE.toLazyByteStringWith (BE.safeStrategy 128 BE.smallChunkSize) mempty
+{-# INLINE toStrict #-}
 
 bech32_charset :: BS.ByteString
 bech32_charset = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
@@ -52,6 +53,7 @@
 encode :: BS.ByteString -> BS.ByteString
 encode dat = toStrict (go dat) where
   bech32_char = fi . BS.index bech32_charset . fi
+
   go bs = case BS.splitAt 5 bs of
     (chunk, etc) -> case BS.length etc of
       -- https://datatracker.ietf.org/doc/html/rfc4648#section-6
@@ -63,8 +65,12 @@
             let a = BU.unsafeIndex chunk 0
                 t = bech32_char ((a .&. 0b11111000) `B.shiftR` 3)
                 u = bech32_char ((a .&. 0b00000111) `B.shiftL` 2)
-            in  BSB.word8 t <> BSB.word8 u
 
+                !w16 = fi t
+                   .|. fi u `B.shiftL` 8
+
+            in  BSB.word16LE w16
+
         | BS.length chunk == 2 ->
             let a = BU.unsafeIndex chunk 0
                 b = BU.unsafeIndex chunk 1
@@ -74,8 +80,14 @@
                       .|. ((b .&. 0b11000000) `B.shiftR` 6)
                 v = bech32_char ((b .&. 0b00111110) `B.shiftR` 1)
                 w = bech32_char ((b .&. 0b00000001) `B.shiftL` 4)
-            in  BSB.word8 t <> BSB.word8 u <> BSB.word8 v <> BSB.word8 w
 
+                !w32 = fi t
+                   .|. fi u `B.shiftL` 8
+                   .|. fi v `B.shiftL` 16
+                   .|. fi w `B.shiftL` 24
+
+            in  BSB.word32LE w32
+
         | BS.length chunk == 3 ->
             let a = BU.unsafeIndex chunk 0
                 b = BU.unsafeIndex chunk 1
@@ -89,9 +101,14 @@
                           ((b .&. 0b00000001) `B.shiftL` 4)
                       .|. ((c .&. 0b11110000) `B.shiftR` 4)
                 x = bech32_char ((c .&. 0b00001111) `B.shiftL` 1)
-            in  BSB.word8 t <> BSB.word8 u <> BSB.word8 v <> BSB.word8 w
-                <> BSB.word8 x
 
+                !w32 = fi t
+                   .|. fi u `B.shiftL` 8
+                   .|. fi v `B.shiftL` 16
+                   .|. fi w `B.shiftL` 24
+
+            in  BSB.word32LE w32 <> BSB.word8 x
+
         | BS.length chunk == 4 ->
             let a = BU.unsafeIndex chunk 0
                 b = BU.unsafeIndex chunk 1
@@ -110,9 +127,17 @@
                       .|. ((d .&. 0b10000000) `B.shiftR` 7)
                 y = bech32_char ((d .&. 0b01111100) `B.shiftR` 2)
                 z = bech32_char ((d .&. 0b00000011) `B.shiftL` 3)
-            in  BSB.word8 t <> BSB.word8 u <> BSB.word8 v <> BSB.word8 w
-                <> BSB.word8 x <> BSB.word8 y <> BSB.word8 z
 
+                !w32 = fi t
+                   .|. fi u `B.shiftL` 8
+                   .|. fi v `B.shiftL` 16
+                   .|. fi w `B.shiftL` 24
+
+                !w16 = fi x
+                   .|. fi y `B.shiftL` 8
+
+            in  BSB.word32LE w32 <> BSB.word16LE w16 <> BSB.word8 z
+
         | otherwise -> mempty
 
       _ -> case BS.unsnoc chunk of
@@ -134,7 +159,7 @@
       w8_6 = bech32_char (mask .&. (w32 `B.shiftL` 03 .|. w8 `B.shiftR` 05))
       w8_7 = bech32_char (mask .&. w8)
 
-      w64 = w8_0
+      !w64 = w8_0
         .|. w8_1 `B.shiftL` 8
         .|. w8_2 `B.shiftL` 16
         .|. w8_3 `B.shiftL` 24
@@ -144,6 +169,7 @@
         .|. w8_7 `B.shiftL` 56
 
   in  BSB.word64LE w64
+{-# INLINE arrange #-}
 
 -- naive base32 -> word5
 as_word5 :: BS.ByteString -> BS.ByteString
@@ -209,7 +235,7 @@
 verify enc b32 = case BS.elemIndexEnd 0x31 b32 of
   Nothing  -> False
   Just idx ->
-    let (hrp, BS.drop 1 -> dat) = BS.splitAt idx b32
+    let (hrp, BU.unsafeDrop 1 -> dat) = BS.splitAt idx b32
         bs = hrp_expand hrp <> as_word5 dat
     in  polymod bs == case enc of
           Bech32 -> 1
diff --git a/lib/Data/ByteString/Bech32.hs b/lib/Data/ByteString/Bech32.hs
--- a/lib/Data/ByteString/Bech32.hs
+++ b/lib/Data/ByteString/Bech32.hs
@@ -32,6 +32,7 @@
 toStrict :: BSB.Builder -> BS.ByteString
 toStrict = BS.toStrict
   . BE.toLazyByteStringWith (BE.safeStrategy 128 BE.smallChunkSize) mempty
+{-# INLINE toStrict #-}
 
 create_checksum :: BS.ByteString -> BS.ByteString -> BS.ByteString
 create_checksum = B32.create_checksum Bech32
diff --git a/lib/Data/ByteString/Bech32m.hs b/lib/Data/ByteString/Bech32m.hs
--- a/lib/Data/ByteString/Bech32m.hs
+++ b/lib/Data/ByteString/Bech32m.hs
@@ -32,6 +32,7 @@
 toStrict :: BSB.Builder -> BS.ByteString
 toStrict = BS.toStrict
   . BE.toLazyByteStringWith (BE.safeStrategy 128 BE.smallChunkSize) mempty
+{-# INLINE toStrict #-}
 
 create_checksum :: BS.ByteString -> BS.ByteString -> BS.ByteString
 create_checksum = B32.create_checksum Bech32m
@@ -44,7 +45,7 @@
 encode
   :: BS.ByteString        -- ^ base255-encoded human-readable part
   -> BS.ByteString        -- ^ base255-encoded data part
-  -> Maybe BS.ByteString  -- ^ bech32-encoded bytestring
+  -> Maybe BS.ByteString  -- ^ bech32m-encoded bytestring
 encode hrp (B32.encode -> dat) = do
   guard (B32.valid_hrp hrp)
   let check = create_checksum hrp (B32.as_word5 dat)
diff --git a/ppad-bech32.cabal b/ppad-bech32.cabal
--- a/ppad-bech32.cabal
+++ b/ppad-bech32.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               ppad-bech32
-version:            0.1.1
+version:            0.1.2
 synopsis:           The bech32 and bech32m encodings, per BIPs 173 & 350.
 license:            MIT
 license-file:       LICENSE
