diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,8 @@
 # Changelog
 
+- 0.2.1 (2025-03-02)
+  * Various documentation improvements.
+
 - 0.2.0 (2025-02-27)
   * 'seed' now validates the words in the mnemonic supplied to it;
     'seed_unsafe' has been added as a function that works for any
diff --git a/bench/Main.hs b/bench/Main.hs
--- a/bench/Main.hs
+++ b/bench/Main.hs
@@ -1,4 +1,24 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE OverloadedStrings #-}
+
 module Main where
 
+import Criterion.Main
+import Crypto.KDF.BIP39
+
 main :: IO ()
-main = pure ()
+main = defaultMain [
+    bgroup "ppad-bip39" [
+        bench_mnemonic
+      , bench_seed
+    ]
+  ]
+
+bench_mnemonic :: Benchmark
+bench_mnemonic = bench "mnemonic" $ nf mnemonic "my ultra secret entropy!"
+
+bench_seed :: Benchmark
+bench_seed = bench "seed" $ nf (seed mnem) mempty where
+  mnem = "hope simple bubble suggest elbow correct limb hole gloom nasty fringe dolphin finger demand situate unlock junior autumn"
+
diff --git a/lib/Crypto/KDF/BIP39.hs b/lib/Crypto/KDF/BIP39.hs
--- a/lib/Crypto/KDF/BIP39.hs
+++ b/lib/Crypto/KDF/BIP39.hs
@@ -3,7 +3,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 -- |
--- Module: Crypto.HDKey.BIP32
+-- Module: Crypto.HDKey.BIP39
 -- Copyright: (c) 2025 Jared Tobin
 -- License: MIT
 -- Maintainer: Jared Tobin <jared@ppad.tech>
@@ -25,6 +25,8 @@
   , seed_unsafe
 
   -- * Wordlists
+  --
+  -- $wordlists
   , Wordlist(..)
   , english
   , chinese_traditional
@@ -234,6 +236,19 @@
 
 -- wordlists ------------------------------------------------------------------
 
+-- $wordlists
+--
+-- Wordlists for various languages.
+--
+-- For the following examples:
+--
+-- >>> import qualified Data.Text.IO as TIO
+-- >>> let trop = "0123456789abcdef"
+
+-- | The default English wordlist.
+--
+--   >>> TIO.putStrLn $ _mnemonic english trop
+--   coral maze mimic half fat breeze thought club give brass bone snake
 english :: Wordlist
 english = unsafePerformIO $ do
   wlist <- fmap TE.decodeUtf8 (BS.readFile "etc/english.txt")
@@ -241,6 +256,10 @@
   pure (Wordlist (PA.arrayFromList ls))
 {-# NOINLINE english #-}
 
+-- | The default Traditional Chinese wordlist.
+--
+--   >>> TIO.putStrLn $ _mnemonic chinese_traditional trop
+--   持 樓 粗 殺 承 圖 湧 整 拿 路 式 棋
 chinese_traditional :: Wordlist
 chinese_traditional = unsafePerformIO $ do
   wlist <- fmap TE.decodeUtf8 (BS.readFile "etc/chinese_traditional.txt")
@@ -248,6 +267,10 @@
   pure (Wordlist (PA.arrayFromList ls))
 {-# NOINLINE chinese_traditional #-}
 
+-- | The default Simplified Chinese wordlist.
+--
+--   >>> TIO.putStrLn $ _mnemonic chinese_simplified trop
+--   持 楼 粗 杀 承 图 涌 整 拿 路 式 棋
 chinese_simplified :: Wordlist
 chinese_simplified = unsafePerformIO $ do
   wlist <- fmap TE.decodeUtf8 (BS.readFile "etc/chinese_simplified.txt")
@@ -255,6 +278,10 @@
   pure (Wordlist (PA.arrayFromList ls))
 {-# NOINLINE chinese_simplified #-}
 
+-- | The default Korean wordlist.
+--
+--   >>> TIO.putStrLn $ _mnemonic korean trop
+--   대문 어쩐지 여덟 설거지 볶음 그늘 태권도 단맛 상반기 균형 국왕 진출
 korean :: Wordlist
 korean = unsafePerformIO $ do
   wlist <- fmap TE.decodeUtf8 (BS.readFile "etc/korean.txt")
@@ -262,6 +289,10 @@
   pure (Wordlist (PA.arrayFromList ls))
 {-# NOINLINE korean #-}
 
+-- | The default French wordlist.
+--
+--   >>> TIO.putStrLn $ _mnemonic french trop
+--   chlorure kimono légume flamme endroit bénéfice soulever céleste falaise belette banlieue reprise
 french :: Wordlist
 french = unsafePerformIO $ do
   wlist <- fmap TE.decodeUtf8 (BS.readFile "etc/french.txt")
@@ -269,6 +300,10 @@
   pure (Wordlist (PA.arrayFromList ls))
 {-# NOINLINE french #-}
 
+-- | The default Spanish wordlist.
+--
+--   >>> TIO.putStrLn $ _mnemonic spanish trop
+--   charla marido mente guía explicar banco tapa casco gemelo balcón ayuda ropa
 spanish :: Wordlist
 spanish = unsafePerformIO $ do
   wlist <- fmap TE.decodeUtf8 (BS.readFile "etc/spanish.txt")
@@ -276,6 +311,10 @@
   pure (Wordlist (PA.arrayFromList ls))
 {-# NOINLINE spanish #-}
 
+-- | The default Czech wordlist.
+--
+--   >>> TIO.putStrLn $ _mnemonic czech trop
+--   hadr omladina oslepit metr krajina deflace varovat flirt lovec dechovka cudnost svitek
 czech :: Wordlist
 czech = unsafePerformIO $ do
   wlist <- fmap TE.decodeUtf8 (BS.readFile "etc/czech.txt")
@@ -283,6 +322,10 @@
   pure (Wordlist (PA.arrayFromList ls))
 {-# NOINLINE czech #-}
 
+-- |  The default Italian wordlist.
+--
+--   >>> TIO.putStrLn $ _mnemonic italian trop
+--   conferma nevrotico obbligo indole florido benigno svista cigno grotta belva barbaro sfocato
 italian :: Wordlist
 italian = unsafePerformIO $ do
   wlist <- fmap TE.decodeUtf8 (BS.readFile "etc/italian.txt")
@@ -290,6 +333,10 @@
   pure (Wordlist (PA.arrayFromList ls))
 {-# NOINLINE italian #-}
 
+-- | The default Portuguese wordlist.
+--
+--   >>> TIO.putStrLn $ _mnemonic portuguese trop
+--   capacho juba lareira figurado ejetar avaliar sonhador cachorro exposto autismo aterro refinar
 portuguese :: Wordlist
 portuguese = unsafePerformIO $ do
   wlist <- fmap TE.decodeUtf8 (BS.readFile "etc/portuguese.txt")
@@ -297,6 +344,10 @@
   pure (Wordlist (PA.arrayFromList ls))
 {-# NOINLINE portuguese #-}
 
+-- | The default Japanese wordlist.
+--
+--   >>> TIO.putStrLn $ _mnemonic japanese trop
+--   きおん たさい たまご しゃおん こふん えきたい ますく がはく しかい えおり うろこ ひとごみ
 japanese :: Wordlist
 japanese = unsafePerformIO $ do
   wlist <- fmap TE.decodeUtf8 (BS.readFile "etc/japanese.txt")
diff --git a/ppad-bip39.cabal b/ppad-bip39.cabal
--- a/ppad-bip39.cabal
+++ b/ppad-bip39.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               ppad-bip39
-version:            0.2.0
+version:            0.2.1
 synopsis:           BIP39 mnemonic codes.
 license:            MIT
 license-file:       LICENSE
