diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,5 +1,8 @@
 Data-SWord
 ==========
+
+[![Hackage](https://img.shields.io/hackage/v/data-sword.svg)](http://hackage.haskell.org/package/data-sword)
+
 This package provides Template Haskell utilities for declaring short binary word
 data types built on top of longer binary word data types. Signed and unsigned
 2, 4, 7, 24, and 48-bit types are predefined.
diff --git a/data-sword.cabal b/data-sword.cabal
--- a/data-sword.cabal
+++ b/data-sword.cabal
@@ -1,12 +1,12 @@
 Name: data-sword
-Version: 0.1.1
+Version: 0.2
 Category: Data
 Stability: experimental
 Synopsis: Shorter binary words
 Description:
   This package provides Template Haskell utilities for declaring short binary
   word data types built on top of longer binary word data types. Signed and
-  unsigned 2, 4, 7, 24, and 48-bit types are predefined.
+  unsigned 2, 3, 4, 5, 6, 7, 24, and 48-bit types are predefined.
 
 Homepage: https://github.com/mvv/data-sword
 Bug-Reports: https://github.com/mvv/data-sword/issues
@@ -29,7 +29,7 @@
 
 Library
   Default-Language: Haskell2010
-  Build-Depends: base >= 4.6 && < 5
+  Build-Depends: base >= 4.7 && < 5
                , template-haskell
                , hashable >= 1.1
                , data-bword >= 0.1
@@ -42,7 +42,7 @@
 Test-Suite tests
   Default-Language: Haskell2010
   Type: exitcode-stdio-1.0
-  Build-Depends: base >= 4.6 && < 5
+  Build-Depends: base
                , tasty >= 0.8
                , tasty-quickcheck >= 0.8
                , data-sword
diff --git a/src/Data/ShortWord.hs b/src/Data/ShortWord.hs
--- a/src/Data/ShortWord.hs
+++ b/src/Data/ShortWord.hs
@@ -3,27 +3,54 @@
 {-# LANGUAGE TypeFamilies #-}
 
 -- | This module provides signed and unsigned binary word data types of sizes
---   2, 4, 7, 24, and 48 bits.
+--   2, 3, 4, 5, 6, 7, 24, and 48 bits.
 module Data.ShortWord
   ( module Data.BinaryWord
   , Word2
+  , aWord2
+  , Word3
+  , aWord3
   , Word4
+  , aWord4
+  , Word5
+  , aWord5
+  , Word6
+  , aWord6
   , Word7
+  , aWord7
   , Word24
+  , aWord24
   , Word48
+  , aWord48
   , Int2
+  , anInt2
+  , Int3
+  , anInt3
   , Int4
+  , anInt4
+  , Int5
+  , anInt5
+  , Int6
+  , anInt6
   , Int7
+  , anInt7
   , Int24
+  , anInt24
   , Int48
+  , anInt48
   ) where
 
 import Data.Word
 import Data.BinaryWord
 import Data.ShortWord.TH
 
-mkShortWord "Word2" "Word2" "Int2" "Int2" ''Word8 2 []
-mkShortWord "Word4" "Word4" "Int4" "Int4" ''Word8 4 []
-mkShortWord "Word7" "Word7" "Int7" "Int7" ''Word8 7 []
-mkShortWord "Word24" "Word24" "Int24" "Int24" ''Word32 24 []
-mkShortWord "Word48" "Word48" "Int48" "Int48" ''Word64 48 []
+mkShortWord "Word2" "Word2" "aWord2" "Int2" "Int2" "anInt2" ''Word8 2 []
+mkShortWord "Word3" "Word3" "aWord3" "Int3" "Int3" "anInt3" ''Word8 3 []
+mkShortWord "Word4" "Word4" "aWord4" "Int4" "Int4" "anInt4" ''Word8 4 []
+mkShortWord "Word5" "Word5" "aWord5" "Int5" "Int5" "anInt5" ''Word8 5 []
+mkShortWord "Word6" "Word6" "aWord6" "Int6" "Int6" "anInt6" ''Word8 6 []
+mkShortWord "Word7" "Word7" "aWord7" "Int7" "Int7" "anInt7" ''Word8 7 []
+mkShortWord "Word24" "Word24" "aWord24" "Int24" "Int24" "anInt24"
+            ''Word32 24 []
+mkShortWord "Word48" "Word48" "aWord48" "Int48" "Int48" "anInt48"
+            ''Word64 48 []
diff --git a/src/Data/ShortWord/TH.hs b/src/Data/ShortWord/TH.hs
--- a/src/Data/ShortWord/TH.hs
+++ b/src/Data/ShortWord/TH.hs
@@ -10,11 +10,10 @@
 import GHC.Arr (Ix(..))
 import GHC.Enum (succError, predError, toEnumError)
 import Data.Data
+import Data.Proxy (Proxy(..))
 import Data.Ratio ((%))
 import Data.Bits (Bits(..))
-#if MIN_VERSION_base(4,7,0)
 import Data.Bits (FiniteBits(..))
-#endif
 #if MIN_VERSION_hashable(1,2,0)
 import Data.Hashable (Hashable(..), hashWithSalt)
 #else
@@ -34,28 +33,33 @@
 --   'Hashable', 'Ix', 'Bits', 'BinaryWord'.
 mkShortWord ∷ String -- ^ Unsigned variant type name
             → String -- ^ Unsigned variant constructor name
+            → String -- ^ Unsigned variant proxy name
             → String -- ^ Signed variant type name
             → String -- ^ Signed variant constructor name
+            → String -- ^ Signed variant proxy name
             → Name   -- ^ The underlying (unsigned) type
             → Int    -- ^ The bit length
             → [Name] -- ^ List of instances for automatic derivation
             → Q [Dec]
-mkShortWord un uc sn sc utp bl ad =
-    (++) <$> mkShortWord' False un' uc' sn' sc' utp bl ad
-         <*> mkShortWord' True  sn' sc' un' uc' utp bl ad
-  where un' = mkName un
-        uc' = mkName uc
-        sn' = mkName sn
-        sc' = mkName sc
+mkShortWord un uc upn sn sc spn utp bl ad =
+    (++) <$> mkShortWord' False un' uc' upn' sn' sc' utp bl ad
+         <*> mkShortWord' True  sn' sc' spn' un' uc' utp bl ad
+  where un'  = mkName un
+        uc'  = mkName uc
+        upn' = mkName upn
+        sn'  = mkName sn
+        sc'  = mkName sc
+        spn' = mkName spn
 
 mkShortWord' ∷ Bool
              → Name → Name
+             → Name
              → Name → Name
              → Name
              → Int
              → [Name]
              → Q [Dec]
-mkShortWord' signed tp cn otp ocn utp bl ad = returnDecls $
+mkShortWord' signed tp cn pn otp ocn utp bl ad = returnDecls $
     [ NewtypeD [] tp []
 #if MIN_VERSION_template_haskell(2,11,0)
                Nothing
@@ -70,6 +74,8 @@
 #else
                (union [''Typeable] ad)
 #endif
+    , SigD pn (AppT (ConT ''Proxy) tpT)
+    , fun pn $ ConE 'Proxy
     , inst ''Eq [tp] $
         {- (W x) == (W y) = x == y -}
         [ funUn2 '(==) $ appVN '(==) [x, y]
@@ -337,11 +343,9 @@
         {- bitSize _ = SIZE -}
         [ fun_ 'bitSize $ sizeE
         , inline 'bitSize
-#if MIN_VERSION_base(4,7,0)
         {- bitSizeMaybe _ = Just SIZE -}
         , fun_ 'bitSizeMaybe $ app (ConE 'Just) [sizeE]
         , inline 'bitSizeMaybe
-#endif
         {- isSigned _ = SIGNED -}
         , fun_ 'isSigned $ ConE $ if signed then 'True else 'False
         , inline 'isSigned
@@ -412,7 +416,6 @@
         , funUn 'popCount $ appVN 'popCount [x]
         , inline 'popCount
         ]
-#if MIN_VERSION_base(4,7,0)
     , inst ''FiniteBits [tp]
         {- finiteBitSize _ = SIZE -}
         [ fun_ 'finiteBitSize $ sizeE
@@ -426,7 +429,6 @@
         , inline 'countTrailingZeros
 # endif
         ]
-#endif
     , inst ''BinaryWord [tp]
         [ tySynInst ''UnsignedWord [tpT] $
             ConT $ if signed then otp else tp
@@ -610,13 +612,7 @@
     litS = LitE . StringL
     sizeE = litI $ toInteger bl
     shiftE = appV '(-)
-               [ appV
-#if MIN_VERSION_base(4,7,0)
-                      'finiteBitSize 
-#else
-                      'bitSize 
-#endif
-                      [SigE (VarE 'undefined) uT]
+               [ appV 'finiteBitSize [SigE (VarE 'undefined) uT]
                , sizeE ]
     maskE = appV 'shiftL [VarE 'allOnes, shiftE]
     returnDecls ds = do
diff --git a/tests/Tests.hs b/tests/Tests.hs
--- a/tests/Tests.hs
+++ b/tests/Tests.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE UnicodeSyntax #-}
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
@@ -36,10 +35,6 @@
      $ testGroup "Tests"
          [ isoTestGroup "Word64/16" (0 ∷ U16)
          , isoTestGroup "Int64/16" (0 ∷ I16) ]
-
-#if !MIN_VERSION_base(4,7,0)
-finiteBitSize = bitSize
-#endif
 
 isoTestGroup name t =
   testGroup name
diff --git a/tests/Types.hs b/tests/Types.hs
--- a/tests/Types.hs
+++ b/tests/Types.hs
@@ -6,4 +6,4 @@
 import Data.Word
 import Data.ShortWord.TH
 
-mkShortWord "U16" "U16" "I16" "I16" ''Word64 16 []
+mkShortWord "U16" "U16" "aU16" "I16" "I16" "anI16" ''Word64 16 []
