diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright John Ky (c) 2016
+Copyright John Ky (c) 2017
 
 All rights reserved.
 
diff --git a/hw-bits.cabal b/hw-bits.cabal
--- a/hw-bits.cabal
+++ b/hw-bits.cabal
@@ -1,5 +1,5 @@
 name:                   hw-bits
-version:                0.6.0.0
+version:                0.7.0.0
 synopsis:               Bit manipulation
 description:            Please see README.md
 homepage:               http://github.com/haskell-works/hw-bits#readme
@@ -41,7 +41,6 @@
                       , HaskellWorks.Data.Bits.PopCount.PopCount1
                       , HaskellWorks.Data.Bits.Types.Broadword
                       , HaskellWorks.Data.Bits.Types.Builtin
-                      , HaskellWorks.Data.Bits.Unmatched
                       , HaskellWorks.Data.Bits.Word
   build-depends:        base                          >= 4          && < 5
                       , bytestring
@@ -66,7 +65,6 @@
                       , HaskellWorks.Data.Bits.BitWiseSpec
                       , HaskellWorks.Data.Bits.FromBitTextByteStringSpec
                       , HaskellWorks.Data.Bits.Log2Spec
-                      , HaskellWorks.Data.Bits.UnmatchedSpec
   build-depends:        base                          >= 4          && < 5
                       , bytestring
                       , hspec
diff --git a/src/HaskellWorks/Data/Bits.hs b/src/HaskellWorks/Data/Bits.hs
--- a/src/HaskellWorks/Data/Bits.hs
+++ b/src/HaskellWorks/Data/Bits.hs
@@ -1,16 +1,11 @@
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits
     ( module X
     ) where
 
-import           HaskellWorks.Data.Bits.BitLength as X
-import           HaskellWorks.Data.Bits.BitParse  as X
-import           HaskellWorks.Data.Bits.BitRead   as X
-import           HaskellWorks.Data.Bits.BitShow   as X
-import           HaskellWorks.Data.Bits.BitShown  as X
-import           HaskellWorks.Data.Bits.BitWise   as X
-import           HaskellWorks.Data.Bits.PopCount  as X
+import HaskellWorks.Data.Bits.BitLength as X
+import HaskellWorks.Data.Bits.BitParse  as X
+import HaskellWorks.Data.Bits.BitRead   as X
+import HaskellWorks.Data.Bits.BitShow   as X
+import HaskellWorks.Data.Bits.BitShown  as X
+import HaskellWorks.Data.Bits.BitWise   as X
+import HaskellWorks.Data.Bits.PopCount  as X
diff --git a/src/HaskellWorks/Data/Bits/AllExcess/AllExcess0.hs b/src/HaskellWorks/Data/Bits/AllExcess/AllExcess0.hs
--- a/src/HaskellWorks/Data/Bits/AllExcess/AllExcess0.hs
+++ b/src/HaskellWorks/Data/Bits/AllExcess/AllExcess0.hs
@@ -2,13 +2,14 @@
 
 module HaskellWorks.Data.Bits.AllExcess.AllExcess0 where
 
-import           Data.Word
-import qualified Data.Vector.Storable             as DVS
-import           HaskellWorks.Data.Bits.PopCount.PopCount0
-import           HaskellWorks.Data.Bits.PopCount.PopCount1
+import Data.Word
+import HaskellWorks.Data.Bits.PopCount.PopCount0
+import HaskellWorks.Data.Bits.PopCount.PopCount1
 
--- TODO Optimise these instances
+import qualified Data.Vector.Storable as DVS
+
 class AllExcess0 a where
+  -- | Number of 0-bits minues the number of 1-bits.
   allExcess0 :: a -> Int
 
 instance AllExcess0 [Bool] where
diff --git a/src/HaskellWorks/Data/Bits/AllExcess/AllExcess1.hs b/src/HaskellWorks/Data/Bits/AllExcess/AllExcess1.hs
--- a/src/HaskellWorks/Data/Bits/AllExcess/AllExcess1.hs
+++ b/src/HaskellWorks/Data/Bits/AllExcess/AllExcess1.hs
@@ -2,14 +2,15 @@
 
 module HaskellWorks.Data.Bits.AllExcess.AllExcess1 where
 
-import           Data.Word
-import qualified Data.Vector                                as DV
-import qualified Data.Vector.Storable                       as DVS
-import           HaskellWorks.Data.Bits.PopCount.PopCount0
-import           HaskellWorks.Data.Bits.PopCount.PopCount1
+import Data.Word
+import HaskellWorks.Data.Bits.PopCount.PopCount0
+import HaskellWorks.Data.Bits.PopCount.PopCount1
 
--- TODO Optimise these instances
+import qualified Data.Vector          as DV
+import qualified Data.Vector.Storable as DVS
+
 class AllExcess1 a where
+  -- | Number of 1-bits minues the number of 0-bits.
   allExcess1 :: a -> Int
 
 instance AllExcess1 [Bool] where
diff --git a/src/HaskellWorks/Data/Bits/BitLength.hs b/src/HaskellWorks/Data/Bits/BitLength.hs
--- a/src/HaskellWorks/Data/Bits/BitLength.hs
+++ b/src/HaskellWorks/Data/Bits/BitLength.hs
@@ -2,11 +2,6 @@
 {-# LANGUAGE FlexibleInstances     #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits.BitLength
     ( -- * Bit map
       BitLength(..)
@@ -14,18 +9,20 @@
     , elemBitEnd
     ) where
 
-import qualified Data.Vector                         as DV
-import qualified Data.Vector.Storable                as DVS
-import           Data.Word
-import           HaskellWorks.Data.AtIndex
-import           HaskellWorks.Data.Naive
-import           HaskellWorks.Data.Positioning
-import           Prelude hiding (length)
+import Data.Word
+import HaskellWorks.Data.AtIndex
+import HaskellWorks.Data.Naive
+import HaskellWorks.Data.Positioning
+import Prelude                       hiding (length)
 
--- | Number of bits in a value including ones and zeros.
+import qualified Data.Vector          as DV
+import qualified Data.Vector.Storable as DVS
+
 class BitLength v where
+  -- | Number of bits in a value including ones and zeros.
   bitLength :: v -> Count
 
+  -- | Number of bits in a value including ones and zeros as a position.
   endPosition :: v -> Position
   endPosition = toPosition . bitLength
   {-# INLINE endPosition #-}
diff --git a/src/HaskellWorks/Data/Bits/BitParse.hs b/src/HaskellWorks/Data/Bits/BitParse.hs
--- a/src/HaskellWorks/Data/Bits/BitParse.hs
+++ b/src/HaskellWorks/Data/Bits/BitParse.hs
@@ -1,24 +1,20 @@
 {-# LANGUAGE FlexibleInstances   #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits.BitParse
   ( BitParse(..)
   ) where
 
-import           Control.Applicative
-import qualified Data.ByteString                  as BS
-import qualified Data.Vector                      as DV
-import qualified Data.Vector.Storable             as DVS
-import           Data.Word
-import           GHC.Exts
-import           HaskellWorks.Data.Bits.BitLength
-import           HaskellWorks.Data.Bits.BitWise
-import           HaskellWorks.Data.String.Parse
+import Control.Applicative
+import Data.Word
+import GHC.Exts
+import HaskellWorks.Data.Bits.BitLength
+import HaskellWorks.Data.Bits.BitWise
+import HaskellWorks.Data.String.Parse
+
+import qualified Data.ByteString      as BS
+import qualified Data.Vector          as DV
+import qualified Data.Vector.Storable as DVS
 
 -- | Parsers for bit strings
 class BitParse a where
diff --git a/src/HaskellWorks/Data/Bits/BitRead.hs b/src/HaskellWorks/Data/Bits/BitRead.hs
--- a/src/HaskellWorks/Data/Bits/BitRead.hs
+++ b/src/HaskellWorks/Data/Bits/BitRead.hs
@@ -6,13 +6,14 @@
   ( BitRead(..)
   ) where
 
-import qualified Data.ByteString                 as BS
-import           Data.Maybe
-import qualified Data.Vector                     as DV
-import qualified Data.Vector.Storable            as DVS
-import           Data.Word
-import           HaskellWorks.Data.Bits.BitParse
-import           HaskellWorks.Data.String.Parse
+import Data.Maybe
+import Data.Word
+import HaskellWorks.Data.Bits.BitParse
+import HaskellWorks.Data.String.Parse
+
+import qualified Data.ByteString      as BS
+import qualified Data.Vector          as DV
+import qualified Data.Vector.Storable as DVS
 
 -- | Bit string reader that produces a value of a type
 class BitRead a where
diff --git a/src/HaskellWorks/Data/Bits/BitShow.hs b/src/HaskellWorks/Data/Bits/BitShow.hs
--- a/src/HaskellWorks/Data/Bits/BitShow.hs
+++ b/src/HaskellWorks/Data/Bits/BitShow.hs
@@ -1,11 +1,6 @@
 {-# LANGUAGE FlexibleInstances   #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits.BitShow
   ( BitShow(..)
   , bitShow
diff --git a/src/HaskellWorks/Data/Bits/BitWise.hs b/src/HaskellWorks/Data/Bits/BitWise.hs
--- a/src/HaskellWorks/Data/Bits/BitWise.hs
+++ b/src/HaskellWorks/Data/Bits/BitWise.hs
@@ -2,11 +2,6 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies          #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits.BitWise
     ( -- * Bit map
       BitWise(..)
@@ -14,16 +9,17 @@
     , TestBit(..)
     ) where
 
-import qualified Data.Bits                           as B
-import qualified Data.Vector                         as DV
-import qualified Data.Vector.Storable                as DVS
-import           Data.Word
-import           HaskellWorks.Data.AtIndex
-import           HaskellWorks.Data.Bits.BitLength
-import           HaskellWorks.Data.Naive
-import           HaskellWorks.Data.Positioning
-import           Prelude                             as P
+import Data.Word
+import HaskellWorks.Data.AtIndex
+import HaskellWorks.Data.Bits.BitLength
+import HaskellWorks.Data.Naive
+import HaskellWorks.Data.Positioning
+import Prelude                          as P
 
+import qualified Data.Bits            as B
+import qualified Data.Vector          as DV
+import qualified Data.Vector.Storable as DVS
+
 -- We pervasively use precedence to avoid excessive parentheses, and we use
 -- the same precedence conventions of the C programming language: arithmetic
 -- operators come first, ordered in the standard way, followed by shifts,
@@ -48,13 +44,13 @@
 
 -- | Class of values that have bit wise logical operations
 class BitWise a where
-  -- | Bit wise AND
+  -- | Bit-wise AND
   (.&.) :: a -> a -> a
-  -- | Bit wise OR
+  -- | Bit-wise OR
   (.|.) :: a -> a -> a
-  -- | Bit wise XOR
+  -- | Bit-wise XOR
   (.^.) :: a -> a -> a
-  -- | Bit wise complement
+  -- | Bit-wise complement
   comp  :: a -> a
   -- | Bit-wise value of the given type with all bits set to zero
   all0s :: a
diff --git a/src/HaskellWorks/Data/Bits/Broadword.hs b/src/HaskellWorks/Data/Bits/Broadword.hs
--- a/src/HaskellWorks/Data/Bits/Broadword.hs
+++ b/src/HaskellWorks/Data/Bits/Broadword.hs
@@ -3,11 +3,6 @@
 {-# LANGUAGE ScopedTypeVariables   #-}
 {-# LANGUAGE TypeFamilies          #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits.Broadword
   ( Broadword(..)
   , broadword
@@ -19,10 +14,11 @@
   , kBitDiffUnsafe
   ) where
 
-import qualified Data.Bits                        as DB
-import           Data.Word
-import           HaskellWorks.Data.Bits.BitWise
+import Data.Word
+import HaskellWorks.Data.Bits.BitWise
 
+import qualified Data.Bits as DB
+
 newtype Broadword a = Broadword a deriving (Eq, Show)
 
 broadword :: Broadword Word64 -> Word64
@@ -30,23 +26,23 @@
 {-# INLINE broadword #-}
 
 l :: Int -> Word64
-l 2   = 0x5555555555555555
-l 4   = 0x1111111111111111
-l 8   = 0x0101010101010101
-l 16  = 0x0001000100010001
-l 32  = 0x0000000100000001
-l 64  = 0x0000000000000001
-l k   = error ("Invalid h k where k = " ++ show k)
+l 2  = 0x5555555555555555
+l 4  = 0x1111111111111111
+l 8  = 0x0101010101010101
+l 16 = 0x0001000100010001
+l 32 = 0x0000000100000001
+l 64 = 0x0000000000000001
+l k  = error ("Invalid h k where k = " ++ show k)
 {-# INLINE l #-}
 
 h :: Int -> Word64
-h 2   = 0xaaaaaaaaaaaaaaaa
-h 4   = 0x8888888888888888
-h 8   = 0x8080808080808080
-h 16  = 0x8000800080008000
-h 32  = 0x8000000080000000
-h 64  = 0x8000000000000000
-h k   = error ("Invalid h k where k = " ++ show k)
+h 2  = 0xaaaaaaaaaaaaaaaa
+h 4  = 0x8888888888888888
+h 8  = 0x8080808080808080
+h 16 = 0x8000800080008000
+h 32 = 0x8000000080000000
+h 64 = 0x8000000000000000
+h k  = error ("Invalid h k where k = " ++ show k)
 {-# INLINE h #-}
 
 kBitDiff :: Int -> Word64 -> Word64 -> Word64
diff --git a/src/HaskellWorks/Data/Bits/ElemFixedBitSize.hs b/src/HaskellWorks/Data/Bits/ElemFixedBitSize.hs
--- a/src/HaskellWorks/Data/Bits/ElemFixedBitSize.hs
+++ b/src/HaskellWorks/Data/Bits/ElemFixedBitSize.hs
@@ -1,20 +1,15 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE TypeFamilies      #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
-
 module HaskellWorks.Data.Bits.ElemFixedBitSize
     ( ElemFixedBitSize(..)
     ) where
 
-import qualified Data.Vector                   as DV
-import qualified Data.Vector.Storable          as DVS
-import           Data.Word
-import           HaskellWorks.Data.Positioning
+import Data.Word
+import HaskellWorks.Data.Positioning
+
+import qualified Data.Vector          as DV
+import qualified Data.Vector.Storable as DVS
 
 -- | Class of values that have elements of a fixed bit size
 --
diff --git a/src/HaskellWorks/Data/Bits/FixedBitSize.hs b/src/HaskellWorks/Data/Bits/FixedBitSize.hs
--- a/src/HaskellWorks/Data/Bits/FixedBitSize.hs
+++ b/src/HaskellWorks/Data/Bits/FixedBitSize.hs
@@ -1,15 +1,9 @@
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
-
 module HaskellWorks.Data.Bits.FixedBitSize
     ( FixedBitSize(..)
     ) where
 
-import           Data.Word
-import           HaskellWorks.Data.Positioning
+import Data.Word
+import HaskellWorks.Data.Positioning
 
 -- | Class of values that have a fix bit size
 class FixedBitSize a where
diff --git a/src/HaskellWorks/Data/Bits/FromBitTextByteString.hs b/src/HaskellWorks/Data/Bits/FromBitTextByteString.hs
--- a/src/HaskellWorks/Data/Bits/FromBitTextByteString.hs
+++ b/src/HaskellWorks/Data/Bits/FromBitTextByteString.hs
@@ -1,14 +1,15 @@
-{-# LANGUAGE FlexibleInstances  #-}
-{-# LANGUAGE InstanceSigs       #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE InstanceSigs      #-}
 
 module HaskellWorks.Data.Bits.FromBitTextByteString
     ( FromBitTextByteString(..)
     ) where
 
+import Data.Word
+import HaskellWorks.Data.Bits
+
 import qualified Data.ByteString      as BS
 import qualified Data.Vector.Storable as DVS
-import           Data.Word
-import           HaskellWorks.Data.Bits
 
 class FromBitTextByteString a where
   -- | Convert a binary byte string to a value of type @a
@@ -21,16 +22,16 @@
           gen cs = case BS.uncons cs of
             Just (d, ds) | d == w0  -> gen' 1 0 ds
             Just (d, ds) | d == w1  -> gen' 1 1 ds
-            Just (_, ds)            -> gen ds
-            Nothing                 -> Nothing
+            Just (_, ds) -> gen ds
+            Nothing      -> Nothing
           gen' :: Int -> Word8 -> BS.ByteString -> Maybe (Word8, BS.ByteString)
           gen' n w cs
             | n >= 8   = Just (w, cs)
             | otherwise = case BS.uncons cs of
                 Just (d, ds) | d == w0  -> gen' (n + 1) (w .|. (0 .<. fromIntegral n)) ds
                 Just (d, ds) | d == w1  -> gen' (n + 1) (w .|. (1 .<. fromIntegral n)) ds
-                Just (_, ds)            -> gen' n w ds
-                Nothing                 -> Just (w, cs)
+                Just (_, ds) -> gen' n w ds
+                Nothing      -> Just (w, cs)
 
 instance FromBitTextByteString (DVS.Vector Word16) where
   fromBitTextByteString :: BS.ByteString -> DVS.Vector Word16
@@ -39,16 +40,16 @@
           gen cs = case BS.uncons cs of
             Just (d, ds) | d == w0  -> gen' 1 0 ds
             Just (d, ds) | d == w1  -> gen' 1 1 ds
-            Just (_, ds)            -> gen ds
-            Nothing                 -> Nothing
+            Just (_, ds) -> gen ds
+            Nothing      -> Nothing
           gen' :: Int -> Word16 -> BS.ByteString -> Maybe (Word16, BS.ByteString)
           gen' n w cs
             | n >= 16   = Just (w, cs)
             | otherwise = case BS.uncons cs of
                 Just (d, ds) | d == w0  -> gen' (n + 1) (w .|. (0 .<. fromIntegral n)) ds
                 Just (d, ds) | d == w1  -> gen' (n + 1) (w .|. (1 .<. fromIntegral n)) ds
-                Just (_, ds)            -> gen' n w ds
-                Nothing                 -> Just (w, cs)
+                Just (_, ds) -> gen' n w ds
+                Nothing      -> Just (w, cs)
 
 instance FromBitTextByteString (DVS.Vector Word32) where
   fromBitTextByteString :: BS.ByteString -> DVS.Vector Word32
@@ -57,16 +58,16 @@
           gen cs = case BS.uncons cs of
             Just (d, ds) | d == w0  -> gen' 1 0 ds
             Just (d, ds) | d == w1  -> gen' 1 1 ds
-            Just (_, ds)            -> gen ds
-            Nothing                 -> Nothing
+            Just (_, ds) -> gen ds
+            Nothing      -> Nothing
           gen' :: Int -> Word32 -> BS.ByteString -> Maybe (Word32, BS.ByteString)
           gen' n w cs
             | n >= 32   = Just (w, cs)
             | otherwise = case BS.uncons cs of
                 Just (d, ds) | d == w0  -> gen' (n + 1) (w .|. (0 .<. fromIntegral n)) ds
                 Just (d, ds) | d == w1  -> gen' (n + 1) (w .|. (1 .<. fromIntegral n)) ds
-                Just (_, ds)            -> gen' n w ds
-                Nothing                 -> Just (w, cs)
+                Just (_, ds) -> gen' n w ds
+                Nothing      -> Just (w, cs)
 
 instance FromBitTextByteString (DVS.Vector Word64) where
   fromBitTextByteString :: BS.ByteString -> DVS.Vector Word64
@@ -75,16 +76,16 @@
           gen cs = case BS.uncons cs of
             Just (d, ds) | d == w0  -> gen' 1 0 ds
             Just (d, ds) | d == w1  -> gen' 1 1 ds
-            Just (_, ds)            -> gen ds
-            Nothing                 -> Nothing
+            Just (_, ds) -> gen ds
+            Nothing      -> Nothing
           gen' :: Int -> Word64 -> BS.ByteString -> Maybe (Word64, BS.ByteString)
           gen' n w cs
             | n >= 64   = Just (w, cs)
             | otherwise = case BS.uncons cs of
                 Just (d, ds) | d == w0  -> gen' (n + 1) (w .|. (0 .<. fromIntegral n)) ds
                 Just (d, ds) | d == w1  -> gen' (n + 1) (w .|. (1 .<. fromIntegral n)) ds
-                Just (_, ds)            -> gen' n w ds
-                Nothing                 -> Just (w, cs)
+                Just (_, ds) -> gen' n w ds
+                Nothing      -> Just (w, cs)
 
 w0 :: Word8
 w0 = 48
diff --git a/src/HaskellWorks/Data/Bits/LoBitsSized.hs b/src/HaskellWorks/Data/Bits/LoBitsSized.hs
--- a/src/HaskellWorks/Data/Bits/LoBitsSized.hs
+++ b/src/HaskellWorks/Data/Bits/LoBitsSized.hs
@@ -7,6 +7,7 @@
 import HaskellWorks.Data.Positioning
 
 class LoBitsSized a where
+  -- | Value with the n least significant bits set to 1.
   loBitsSized :: Count -> a
 
 instance LoBitsSized Word64 where
diff --git a/src/HaskellWorks/Data/Bits/Log2.hs b/src/HaskellWorks/Data/Bits/Log2.hs
--- a/src/HaskellWorks/Data/Bits/Log2.hs
+++ b/src/HaskellWorks/Data/Bits/Log2.hs
@@ -8,6 +8,7 @@
 import           HaskellWorks.Data.Bits.BitWise
 
 class Log2 a where
+  -- | Log base of the given value rounded down to the nearest integer
   log2 :: a -> Int
 
 log2_64_tab :: DVS.Vector Int
diff --git a/src/HaskellWorks/Data/Bits/PopCount.hs b/src/HaskellWorks/Data/Bits/PopCount.hs
--- a/src/HaskellWorks/Data/Bits/PopCount.hs
+++ b/src/HaskellWorks/Data/Bits/PopCount.hs
@@ -1,20 +1,8 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits.PopCount
-    ( -- * Bit map
-      PopCount(..)
-    , module X
+    ( module X
     ) where
 
-import           HaskellWorks.Data.Bits.PopCount.PopCount0 as X
-import           HaskellWorks.Data.Bits.PopCount.PopCount1 as X
-import           HaskellWorks.Data.Positioning
-
-{-# DEPRECATED #-}
-class PopCount v e where
-  popCount :: e -> v -> Count
+import HaskellWorks.Data.Bits.PopCount.PopCount0 as X
+import HaskellWorks.Data.Bits.PopCount.PopCount1 as X
diff --git a/src/HaskellWorks/Data/Bits/PopCount/PopCount0.hs b/src/HaskellWorks/Data/Bits/PopCount/PopCount0.hs
--- a/src/HaskellWorks/Data/Bits/PopCount/PopCount0.hs
+++ b/src/HaskellWorks/Data/Bits/PopCount/PopCount0.hs
@@ -2,11 +2,6 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies          #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits.PopCount.PopCount0
     ( PopCount0(..)
     ) where
@@ -21,8 +16,8 @@
 import           HaskellWorks.Data.Positioning
 import           Prelude                                   as P
 
--- | The number of zero bits in the value.
 class PopCount0 v where
+  -- | The number of 0-bits in the value.
   popCount0 :: v -> Count
 
 instance PopCount0 Bool where
diff --git a/src/HaskellWorks/Data/Bits/PopCount/PopCount1.hs b/src/HaskellWorks/Data/Bits/PopCount/PopCount1.hs
--- a/src/HaskellWorks/Data/Bits/PopCount/PopCount1.hs
+++ b/src/HaskellWorks/Data/Bits/PopCount/PopCount1.hs
@@ -1,10 +1,5 @@
 {-# LANGUAGE FlexibleInstances     #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits.PopCount.PopCount1
     ( PopCount1(..)
     ) where
@@ -26,8 +21,8 @@
 fastWord = Builtin
 {-# INLINE fastWord #-}
 
--- | The number of one bits in the value.
 class PopCount1 v where
+  -- | The number of 0-bits in the value.
   popCount1 :: v -> Count
 
 instance PopCount1 Bool where
diff --git a/src/HaskellWorks/Data/Bits/Types/Broadword.hs b/src/HaskellWorks/Data/Bits/Types/Broadword.hs
--- a/src/HaskellWorks/Data/Bits/Types/Broadword.hs
+++ b/src/HaskellWorks/Data/Bits/Types/Broadword.hs
@@ -1,14 +1,9 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits.Types.Broadword where
 
 import Data.Vector.Storable
 import HaskellWorks.Data.Bits.BitWise
 
--- | Type wrapper to prefer broadword operations
+-- | Type wrapper to prefer broadword operations.
 newtype Broadword a = Broadword a deriving (BitWise, Eq, Show, Storable)
diff --git a/src/HaskellWorks/Data/Bits/Types/Builtin.hs b/src/HaskellWorks/Data/Bits/Types/Builtin.hs
--- a/src/HaskellWorks/Data/Bits/Types/Builtin.hs
+++ b/src/HaskellWorks/Data/Bits/Types/Builtin.hs
@@ -1,14 +1,9 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
--- |
--- Copyright: 2016 John Ky
--- License: MIT
---
--- Succinct operations.
 module HaskellWorks.Data.Bits.Types.Builtin where
 
 import Data.Vector.Storable
 import HaskellWorks.Data.Bits.BitWise
 
--- | Type wrapper to prefer builting operations
+-- | Type wrapper to prefer builting operations.
 newtype Builtin a = Builtin a deriving (BitWise, Eq, Show, Storable)
diff --git a/src/HaskellWorks/Data/Bits/Unmatched.hs b/src/HaskellWorks/Data/Bits/Unmatched.hs
deleted file mode 100644
--- a/src/HaskellWorks/Data/Bits/Unmatched.hs
+++ /dev/null
@@ -1,206 +0,0 @@
-{-# LANGUAGE FlexibleInstances #-}
-
-module HaskellWorks.Data.Bits.Unmatched
-  ( UnmatchedL0(..)
-  , UnmatchedL1(..)
-  , UnmatchedR0(..)
-  , UnmatchedR1(..)
-  ) where
-
-import qualified Data.Vector.Storable               as DVS
-import           Data.Word
-import           HaskellWorks.Data.Bits.FixedBitSize
-import           HaskellWorks.Data.Bits.BitWise
-import           HaskellWorks.Data.Positioning
-
-bitEnd :: FixedBitSize w => w -> Position
-bitEnd = toPosition . fixedBitSize
-{-# INLINE bitEnd #-}
-
-goL0 :: (TestBit w, FixedBitSize w) => Position -> Int -> w -> Int
-goL0 n c w = if 0 <= n && n < bitEnd w
-  then let delta = if w .?. (bitEnd w - n - 1) then -1 else 1 in goL0 (n + 1) ((c + delta) `max` 0) w
-  else c
-{-# INLINE goL0 #-}
-
-goL1 :: (TestBit w, FixedBitSize w) => Position -> Int -> w -> Int
-goL1 n c w = if 0 <= n && n < bitEnd w
-  then let delta = if w .?. (bitEnd w - n - 1) then 1 else -1 in goL1 (n + 1) ((c + delta) `max` 0) w
-  else c
-{-# INLINE goL1 #-}
-
-goR0 :: (TestBit w, FixedBitSize w) => Position -> Int -> w -> Int
-goR0 n c w = if 0 <= n && n < bitEnd w
-  then let delta = if w .?. n then -1 else 1 in goR0 (n + 1) ((c + delta) `max` 0) w
-  else c
-{-# INLINE goR0 #-}
-
-goR1 :: (TestBit w, FixedBitSize w) => Position -> Int -> w -> Int
-goR1 n c w = if 0 <= n && n < bitEnd w
-  then let delta = if w .?. n then 1 else -1 in goR1 (n + 1) ((c + delta) `max` 0) w
-  else c
-{-# INLINE goR1 #-}
-
-goDVSL0 :: (UnmatchedL0 w, UnmatchedR1 w, DVS.Storable w) => Int -> DVS.Vector w -> Int
-goDVSL0 ub v = if DVS.length v == 0
-  then ub
-  else let a = DVS.last v in goDVSL0 (unmatchedL0 a + ((ub - unmatchedR1 a) `max` 0)) (DVS.init v)
-{-# INLINE goDVSL0 #-}
-
-goDVSL1 :: (UnmatchedL1 w, UnmatchedR0 w, DVS.Storable w) => Int -> DVS.Vector w -> Int
-goDVSL1 ub v = if DVS.length v == 0
-  then ub
-  else let a = DVS.last v in goDVSL1 (unmatchedL1 a + ((ub - unmatchedR0 a) `max` 0)) (DVS.init v)
-{-# INLINE goDVSL1 #-}
-
-goDVSR0 :: (UnmatchedR0 w, UnmatchedL1 w, DVS.Storable w) => Int -> DVS.Vector w -> Int
-goDVSR0 ua v = if DVS.length v == 0
-  then ua
-  else let b = DVS.head v in goDVSR0 (unmatchedR0 b + ((ua - unmatchedL1 b) `max` 0)) (DVS.tail v)
-{-# INLINE goDVSR0 #-}
-
-goDVSR1 :: (UnmatchedR1 w, UnmatchedL0 w, DVS.Storable w) => Int -> DVS.Vector w -> Int
-goDVSR1 ub v = if DVS.length v == 0
-  then ub
-  else let a = DVS.head v in goDVSR1 (unmatchedR1 a + ((ub - unmatchedL0 a) `max` 0)) (DVS.tail v)
-{-# INLINE goDVSR1 #-}
-
-class UnmatchedL0 a where
-  unmatchedL0 :: a -> Int
-
-class UnmatchedL1 a where
-  unmatchedL1 :: a -> Int
-
-class UnmatchedR0 a where
-  unmatchedR0 :: a -> Int
-
-class UnmatchedR1 a where
-  unmatchedR1 :: a -> Int
-
-instance UnmatchedL0 Word8 where
-  unmatchedL0 = goL0 0 0
-  {-# INLINE unmatchedL0 #-}
-
-instance UnmatchedL0 Word16 where
-  unmatchedL0 = goL0 0 0
-  {-# INLINE unmatchedL0 #-}
-
-instance UnmatchedL0 Word32 where
-  unmatchedL0 = goL0 0 0
-  {-# INLINE unmatchedL0 #-}
-
-instance UnmatchedL0 Word64 where
-  unmatchedL0 = goL0 0 0
-  {-# INLINE unmatchedL0 #-}
-
-instance UnmatchedL0 (DVS.Vector Word8) where
-  unmatchedL0 = goDVSL0 0
-  {-# INLINE unmatchedL0 #-}
-
-instance UnmatchedL0 (DVS.Vector Word16) where
-  unmatchedL0 = goDVSL0 0
-  {-# INLINE unmatchedL0 #-}
-
-instance UnmatchedL0 (DVS.Vector Word32) where
-  unmatchedL0 = goDVSL0 0
-  {-# INLINE unmatchedL0 #-}
-
-instance UnmatchedL0 (DVS.Vector Word64) where
-  unmatchedL0 = goDVSL0 0
-  {-# INLINE unmatchedL0 #-}
-
-instance UnmatchedL1 Word8 where
-  unmatchedL1 = goL1 0 0
-  {-# INLINE unmatchedL1 #-}
-
-instance UnmatchedL1 Word16 where
-  unmatchedL1 = goL1 0 0
-  {-# INLINE unmatchedL1 #-}
-
-instance UnmatchedL1 Word32 where
-  unmatchedL1 = goL1 0 0
-  {-# INLINE unmatchedL1 #-}
-
-instance UnmatchedL1 Word64 where
-  unmatchedL1 = goL1 0 0
-  {-# INLINE unmatchedL1 #-}
-
-instance UnmatchedL1 (DVS.Vector Word8) where
-  unmatchedL1 = goDVSL1 0
-  {-# INLINE unmatchedL1 #-}
-
-instance UnmatchedL1 (DVS.Vector Word16) where
-  unmatchedL1 = goDVSL1 0
-  {-# INLINE unmatchedL1 #-}
-
-instance UnmatchedL1 (DVS.Vector Word32) where
-  unmatchedL1 = goDVSL1 0
-  {-# INLINE unmatchedL1 #-}
-
-instance UnmatchedL1 (DVS.Vector Word64) where
-  unmatchedL1 = goDVSL1 0
-  {-# INLINE unmatchedL1 #-}
-
-instance UnmatchedR0 Word8 where
-  unmatchedR0 = goR0 0 0
-  {-# INLINE unmatchedR0 #-}
-
-instance UnmatchedR0 Word16 where
-  unmatchedR0 = goR0 0 0
-  {-# INLINE unmatchedR0 #-}
-
-instance UnmatchedR0 Word32 where
-  unmatchedR0 = goR0 0 0
-  {-# INLINE unmatchedR0 #-}
-
-instance UnmatchedR0 Word64 where
-  unmatchedR0 = goR0 0 0
-  {-# INLINE unmatchedR0 #-}
-
-instance UnmatchedR0 (DVS.Vector Word8) where
-  unmatchedR0 = goDVSR0 0
-  {-# INLINE unmatchedR0 #-}
-
-instance UnmatchedR0 (DVS.Vector Word16) where
-  unmatchedR0 = goDVSR0 0
-  {-# INLINE unmatchedR0 #-}
-
-instance UnmatchedR0 (DVS.Vector Word32) where
-  unmatchedR0 = goDVSR0 0
-  {-# INLINE unmatchedR0 #-}
-
-instance UnmatchedR0 (DVS.Vector Word64) where
-  unmatchedR0 = goDVSR0 0
-  {-# INLINE unmatchedR0 #-}
-
-instance UnmatchedR1 Word8 where
-  unmatchedR1 = goR1 0 0
-  {-# INLINE unmatchedR1 #-}
-
-instance UnmatchedR1 Word16 where
-  unmatchedR1 = goR1 0 0
-  {-# INLINE unmatchedR1 #-}
-
-instance UnmatchedR1 Word32 where
-  unmatchedR1 = goR1 0 0
-  {-# INLINE unmatchedR1 #-}
-
-instance UnmatchedR1 Word64 where
-  unmatchedR1 = goR1 0 0
-  {-# INLINE unmatchedR1 #-}
-
-instance UnmatchedR1 (DVS.Vector Word8) where
-  unmatchedR1 = goDVSR1 0
-  {-# INLINE unmatchedR1 #-}
-
-instance UnmatchedR1 (DVS.Vector Word16) where
-  unmatchedR1 = goDVSR1 0
-  {-# INLINE unmatchedR1 #-}
-
-instance UnmatchedR1 (DVS.Vector Word32) where
-  unmatchedR1 = goDVSR1 0
-  {-# INLINE unmatchedR1 #-}
-
-instance UnmatchedR1 (DVS.Vector Word64) where
-  unmatchedR1 = goDVSR1 0
-  {-# INLINE unmatchedR1 #-}
diff --git a/src/HaskellWorks/Data/Bits/Word.hs b/src/HaskellWorks/Data/Bits/Word.hs
--- a/src/HaskellWorks/Data/Bits/Word.hs
+++ b/src/HaskellWorks/Data/Bits/Word.hs
@@ -9,10 +9,13 @@
 
 class WordConcat a where
   type DoubleWords a
+  -- | Concatenate two words in little-endian order of the same size into a
+  -- word of twice the size.
   leConcat :: a -> a -> DoubleWords a
 
 class WordSplit a where
   type HalfWords a
+  -- | Split a word equally into two smaller words in little-endian order.
   leSplit :: a -> (HalfWords a, HalfWords a)
 
 instance WordConcat Word8 where
diff --git a/test/HaskellWorks/Data/Bits/UnmatchedSpec.hs b/test/HaskellWorks/Data/Bits/UnmatchedSpec.hs
deleted file mode 100644
--- a/test/HaskellWorks/Data/Bits/UnmatchedSpec.hs
+++ /dev/null
@@ -1,88 +0,0 @@
-{-# LANGUAGE ScopedTypeVariables #-}
-
-module HaskellWorks.Data.Bits.UnmatchedSpec (spec) where
-
-import           Data.Vector.Storable                 as DVS
-import           Data.Word
-import           HaskellWorks.Data.Bits.BitWise
-import           HaskellWorks.Data.Bits.FixedBitSize
-import           HaskellWorks.Data.Bits.Unmatched
-import           Test.Hspec
-import           Test.QuickCheck
-
-{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}
-
-spec :: Spec
-spec = describe "HaskellWorks.Data.Bits.UnmatchedSpec" $ do
-  describe "For Word8" $ do
-    it "umatchedL0 concatentation" $
-      property $ \(a :: Word8) (b :: Word8) ->
-        let c :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedL0 a + ((unmatchedL0 b - unmatchedR1 a) `max` 0) `shouldBe` unmatchedL0 c
-    it "umatchedL1 concatentation" $
-      property $ \(a :: Word8) (b :: Word8) ->
-        let c :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedL1 a + ((unmatchedL1 b - unmatchedR0 a) `max` 0) `shouldBe` unmatchedL1 c
-    it "umatchedR0 concatentation" $
-      property $ \(a :: Word8) (b :: Word8) ->
-        let c :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedR0 b + ((unmatchedR0 a - unmatchedL1 b) `max` 0) `shouldBe` unmatchedR0 c
-    it "umatchedR1 concatentation" $
-      property $ \(a :: Word8) (b :: Word8) ->
-        let c :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedR1 b + ((unmatchedR1 a - unmatchedL0 b) `max` 0) `shouldBe` unmatchedR1 c
-  describe "For Word16" $ do
-    it "umatchedL0 concatentation" $
-      property $ \(a :: Word16) (b :: Word16) ->
-        let c :: Word32 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedL0 a + ((unmatchedL0 b - unmatchedR1 a) `max` 0) `shouldBe` unmatchedL0 c
-    it "umatchedL1 concatentation" $
-      property $ \(a :: Word16) (b :: Word16) ->
-        let c :: Word32 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedL1 a + ((unmatchedL1 b - unmatchedR0 a) `max` 0) `shouldBe` unmatchedL1 c
-    it "umatchedR0 concatentation" $
-      property $ \(a :: Word16) (b :: Word16) ->
-        let c :: Word32 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedR0 b + ((unmatchedR0 a - unmatchedL1 b) `max` 0) `shouldBe` unmatchedR0 c
-    it "umatchedR1 concatentation" $
-      property $ \(a :: Word16) (b :: Word16) ->
-        let c :: Word32 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedR1 b + ((unmatchedR1 a - unmatchedL0 b) `max` 0) `shouldBe` unmatchedR1 c
-  describe "For Word32" $ do
-    it "umatchedL0 concatentation" $
-      property $ \(a :: Word32) (b :: Word32) ->
-        let c :: Word64 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedL0 a + ((unmatchedL0 b - unmatchedR1 a) `max` 0) `shouldBe` unmatchedL0 c
-    it "umatchedL1 concatentation" $
-      property $ \(a :: Word32) (b :: Word32) ->
-        let c :: Word64 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedL1 a + ((unmatchedL1 b - unmatchedR0 a) `max` 0) `shouldBe` unmatchedL1 c
-    it "umatchedR0 concatentation" $
-      property $ \(a :: Word32) (b :: Word32) ->
-        let c :: Word64 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedR0 b + ((unmatchedR0 a - unmatchedL1 b) `max` 0) `shouldBe` unmatchedR0 c
-    it "umatchedR1 concatentation" $
-      property $ \(a :: Word32) (b :: Word32) ->
-        let c :: Word64 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedR1 b + ((unmatchedR1 a - unmatchedL0 b) `max` 0) `shouldBe` unmatchedR1 c
-  describe "For (DVS.Vector Word8)" $ do
-    it "umatchedL0 concatentation" $
-      property $ \(a :: Word8) (b :: Word8) ->
-        let c = DVS.fromList [a, b] in
-        let d :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedL0 d `shouldBe` unmatchedL0 c
-    it "umatchedL1 concatentation" $
-      property $ \(a :: Word8) (b :: Word8) ->
-        let c = DVS.fromList [a, b] in
-        let d :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedL1 d `shouldBe` unmatchedL1 c
-    it "umatchedR0 concatentation" $
-      property $ \(a :: Word8) (b :: Word8) ->
-        let c = DVS.fromList [a, b] in
-        let d :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedR0 d `shouldBe` unmatchedR0 c
-    it "umatchedR1 concatentation" $
-      property $ \(a :: Word8) (b :: Word8) ->
-        let c = DVS.fromList [a, b] in
-        let d :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
-        unmatchedR1 d `shouldBe` unmatchedR1 c
