diff --git a/hw-prim.cabal b/hw-prim.cabal
--- a/hw-prim.cabal
+++ b/hw-prim.cabal
@@ -1,5 +1,5 @@
 name:                   hw-prim
-version:                0.3.0.0
+version:                0.3.0.1
 synopsis:               Primitive functions and data types
 description:            Please see README.md
 homepage:               http://github.com/haskell-works/hw-prim#readme
@@ -19,7 +19,7 @@
   main-is:              Main.hs
   ghc-options:          -threaded -rtsopts -with-rtsopts=-N -Wall -msse4.2
   build-depends:        base                          >= 4          && < 5
-                      , hw-prim
+                      , hw-prim                       >= 0.3.0.0
   default-language:     Haskell2010
 
 library
@@ -44,10 +44,12 @@
                       , HaskellWorks.Data.Narrow.Narrow64
                       , HaskellWorks.Data.Positioning
                       , HaskellWorks.Data.Search
+                      , HaskellWorks.Data.Sign
                       , HaskellWorks.Data.Snoc
                       , HaskellWorks.Data.Take
                       , HaskellWorks.Data.TreeCursor
                       , HaskellWorks.Data.Uncons
+                      , HaskellWorks.Data.Unsign
                       , HaskellWorks.Data.Vector.BoxedVectorLike
                       , HaskellWorks.Data.Vector.StorableVectorLike
                       , HaskellWorks.Data.Widen
@@ -72,7 +74,7 @@
   build-depends:        base                          >= 4          && < 5
                       , bytestring
                       , hspec
-                      , hw-prim
+                      , hw-prim                       >= 0.3.0.0
                       , QuickCheck
                       , random
                       , vector
@@ -91,5 +93,5 @@
     Default-Language: Haskell2010
     Build-Depends:      base                          >= 4          && < 5
                       , criterion
-                      , hw-prim
+                      , hw-prim                       >= 0.3.0.0
                       , vector
diff --git a/src/HaskellWorks/Data/AtIndex.hs b/src/HaskellWorks/Data/AtIndex.hs
--- a/src/HaskellWorks/Data/AtIndex.hs
+++ b/src/HaskellWorks/Data/AtIndex.hs
@@ -17,119 +17,119 @@
 import           HaskellWorks.Data.Positioning
 
 class Length v => AtIndex v where
-  (!!!) :: v -> Position -> Elem v
+  (!!!)   :: v -> Position -> Elem v
   atIndex :: v -> Position -> Elem v
 
 instance AtIndex [a] where
-  (!!!) v i = v !! fromIntegral i
+  (!!!)   v i = v !! fromIntegral i
   atIndex v i = v !! fromIntegral i
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex BS.ByteString where
-  (!!!) v i = v `BS.index` fromIntegral i
+  (!!!)   v i = v `BS.index` fromIntegral i
   atIndex v i = BS.index v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DV.Vector Word8) where
-  (!!!) v i = v DV.! fromIntegral i
+  (!!!)   v i = v DV.! fromIntegral i
   atIndex v i = DV.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DV.Vector Word16) where
-  (!!!) v i = v DV.! fromIntegral i
+  (!!!)   v i = v DV.! fromIntegral i
   atIndex v i = DV.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DV.Vector Word32) where
-  (!!!) v i = v DV.! fromIntegral i
+  (!!!)   v i = v DV.! fromIntegral i
   atIndex v i = DV.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DV.Vector Word64) where
-  (!!!) v i = v DV.! fromIntegral i
+  (!!!)   v i = v DV.! fromIntegral i
   atIndex v i = DV.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DVS.Vector Word8) where
-  (!!!) v i = v DVS.! fromIntegral i
+  (!!!)   v i = v DVS.! fromIntegral i
   atIndex v i = DVS.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DVS.Vector Word16) where
-  (!!!) v i = v DVS.! fromIntegral i
+  (!!!)   v i = v DVS.! fromIntegral i
   atIndex v i = DVS.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DVS.Vector Word32) where
-  (!!!) v i = v DVS.! fromIntegral i
+  (!!!)   v i = v DVS.! fromIntegral i
   atIndex v i = DVS.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DVS.Vector Word64) where
-  (!!!) v i = v DVS.! fromIntegral i
+  (!!!)   v i = v DVS.! fromIntegral i
   atIndex v i = DVS.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DV.Vector Int8) where
-  (!!!) v i = v DV.! fromIntegral i
+  (!!!)   v i = v DV.! fromIntegral i
   atIndex v i = DV.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DV.Vector Int16) where
-  (!!!) v i = v DV.! fromIntegral i
+  (!!!)   v i = v DV.! fromIntegral i
   atIndex v i = DV.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DV.Vector Int32) where
-  (!!!) v i = v DV.! fromIntegral i
+  (!!!)   v i = v DV.! fromIntegral i
   atIndex v i = DV.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DV.Vector Int64) where
-  (!!!) v i = v DV.! fromIntegral i
+  (!!!)   v i = v DV.! fromIntegral i
   atIndex v i = DV.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DVS.Vector Int8) where
-  (!!!) v i = v DVS.! fromIntegral i
+  (!!!)   v i = v DVS.! fromIntegral i
   atIndex v i = DVS.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DVS.Vector Int16) where
-  (!!!) v i = v DVS.! fromIntegral i
+  (!!!)   v i = v DVS.! fromIntegral i
   atIndex v i = DVS.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DVS.Vector Int32) where
-  (!!!) v i = v DVS.! fromIntegral i
+  (!!!)   v i = v DVS.! fromIntegral i
   atIndex v i = DVS.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DVS.Vector Int64) where
-  (!!!) v i = v DVS.! fromIntegral i
+  (!!!)   v i = v DVS.! fromIntegral i
   atIndex v i = DVS.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
 
 instance AtIndex (DVS.Vector Int) where
-  (!!!) v i = v DVS.! fromIntegral i
+  (!!!)   v i = v DVS.! fromIntegral i
   atIndex v i = DVS.unsafeIndex v (fromIntegral i)
   {-# INLINE (!!!)   #-}
   {-# INLINE atIndex #-}
diff --git a/src/HaskellWorks/Data/Sign.hs b/src/HaskellWorks/Data/Sign.hs
new file mode 100644
--- /dev/null
+++ b/src/HaskellWorks/Data/Sign.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE TypeFamilies #-}
+
+module HaskellWorks.Data.Sign
+    ( Sign(..)
+    ) where
+
+import Data.Int
+import Data.Word
+
+class Sign a where
+  type SignOf a
+  sign :: a -> SignOf a
+
+instance Sign Word where
+  type SignOf Word = Int
+  sign = fromIntegral
+  {-# INLINE sign #-}
+
+instance Sign Word8 where
+  type SignOf Word8 = Int8
+  sign = fromIntegral
+  {-# INLINE sign #-}
+
+instance Sign Word16 where
+  type SignOf Word16 = Int16
+  sign = fromIntegral
+  {-# INLINE sign #-}
+
+instance Sign Word32 where
+  type SignOf Word32 = Int32
+  sign = fromIntegral
+  {-# INLINE sign #-}
+
+instance Sign Word64 where
+  type SignOf Word64 = Int64
+  sign = fromIntegral
+  {-# INLINE sign #-}
+
+instance Sign Int where
+  type SignOf Int = Int
+  sign = fromIntegral
+  {-# INLINE sign #-}
+
+instance Sign Int8 where
+  type SignOf Int8 = Int8
+  sign = fromIntegral
+  {-# INLINE sign #-}
+
+instance Sign Int16 where
+  type SignOf Int16 = Int16
+  sign = fromIntegral
+  {-# INLINE sign #-}
+
+instance Sign Int32 where
+  type SignOf Int32 = Int32
+  sign = fromIntegral
+  {-# INLINE sign #-}
+
+instance Sign Int64 where
+  type SignOf Int64 = Int64
+  sign = fromIntegral
+  {-# INLINE sign #-}
diff --git a/src/HaskellWorks/Data/Unsign.hs b/src/HaskellWorks/Data/Unsign.hs
new file mode 100644
--- /dev/null
+++ b/src/HaskellWorks/Data/Unsign.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE TypeFamilies #-}
+
+module HaskellWorks.Data.Unsign
+    ( Unsign(..)
+    ) where
+
+import Data.Int
+import Data.Word
+
+class Unsign a where
+  type UnsignOf a
+  unsign :: a -> UnsignOf a
+
+instance Unsign Int where
+  type UnsignOf Int = Word
+  unsign = fromIntegral
+  {-# INLINE unsign #-}
+
+instance Unsign Int8 where
+  type UnsignOf Int8 = Word8
+  unsign = fromIntegral
+  {-# INLINE unsign #-}
+
+instance Unsign Int16 where
+  type UnsignOf Int16 = Word16
+  unsign = fromIntegral
+  {-# INLINE unsign #-}
+
+instance Unsign Int32 where
+  type UnsignOf Int32 = Word32
+  unsign = fromIntegral
+  {-# INLINE unsign #-}
+
+instance Unsign Int64 where
+  type UnsignOf Int64 = Word64
+  unsign = fromIntegral
+  {-# INLINE unsign #-}
+
+instance Unsign Word where
+  type UnsignOf Word = Word
+  unsign = fromIntegral
+  {-# INLINE unsign #-}
+
+instance Unsign Word8 where
+  type UnsignOf Word8 = Word8
+  unsign = fromIntegral
+  {-# INLINE unsign #-}
+
+instance Unsign Word16 where
+  type UnsignOf Word16 = Word16
+  unsign = fromIntegral
+  {-# INLINE unsign #-}
+
+instance Unsign Word32 where
+  type UnsignOf Word32 = Word32
+  unsign = fromIntegral
+  {-# INLINE unsign #-}
+
+instance Unsign Word64 where
+  type UnsignOf Word64 = Word64
+  unsign = fromIntegral
+  {-# INLINE unsign #-}
