diff --git a/Web/ClientSession.hs b/Web/ClientSession.hs
--- a/Web/ClientSession.hs
+++ b/Web/ClientSession.hs
@@ -41,6 +41,7 @@
 import Foreign.Storable
 import System.IO.Unsafe
 import Language.Haskell.TH
+import qualified Data.Ascii as A
 
 type Key = S.ByteString
 
@@ -101,8 +102,8 @@
 
 encrypt :: S.ByteString -- ^ key
         -> S.ByteString -- ^ data
-        -> S.ByteString
-encrypt keyBS dataBS = unsafePerformIO $
+        -> A.Ascii
+encrypt keyBS dataBS = A.unsafeFromByteString $ unsafePerformIO $
     unsafeUseAsCString keyBS $ \keyPtr ->
         unsafeUseAsCStringLen dataBS $ \(dataPtr, dataLen) -> do
             let keyPtr' = castPtr keyPtr
@@ -116,9 +117,9 @@
                 unsafePackCStringFinalizer newPtr' len' $ free newPtr'
 
 decrypt :: S.ByteString -- ^ key
-        -> S.ByteString -- ^ data
+        -> A.Ascii -- ^ data
         -> Maybe S.ByteString
-decrypt keyBS dataBS = unsafePerformIO $
+decrypt keyBS dataA = unsafePerformIO $
     unsafeUseAsCString keyBS $ \keyPtr ->
         unsafeUseAsCStringLen dataBS $ \(dataPtr, dataLen) -> do
             let keyPtr' = castPtr keyPtr
@@ -135,6 +136,8 @@
                         bs <- unsafePackCStringFinalizer newPtr' len'
                             $ free newPtr'
                         return $ Just bs
+  where
+    dataBS = A.toByteString dataA
 
 foreign import ccall unsafe "encrypt"
     c_encrypt :: CUInt -> Ptr CUChar -> Ptr CUChar -> Ptr CUInt
diff --git a/clientsession.cabal b/clientsession.cabal
--- a/clientsession.cabal
+++ b/clientsession.cabal
@@ -1,5 +1,5 @@
 name:            clientsession
-version:         0.4.1
+version:         0.5.0
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -13,7 +13,7 @@
 build-type:      Simple
 homepage:        http://github.com/snoyberg/clientsession/tree/master
 
-flag buildtests
+flag test
   description: Build the executable to run unit tests
   default: False
 
@@ -22,13 +22,14 @@
                      bytestring >= 0.9 && < 0.10,
                      directory >= 1 && < 1.2,
                      random >= 1.0.0.2 && < 1.1,
+                     ascii >= 0.0.2 && < 0.1,
                      template-haskell
     exposed-modules: Web.ClientSession
     ghc-options:     -Wall
     c-sources:       c/aestable.c c/helper.c
 
 executable             runtests
-    if flag(buildtests)
+    if flag(test)
         Buildable: True
         cpp-options:   -DTEST
         build-depends: test-framework,
diff --git a/runtests.hs b/runtests.hs
--- a/runtests.hs
+++ b/runtests.hs
@@ -12,7 +12,7 @@
 
 import Web.ClientSession
 import System.IO.Unsafe
-import Data.Word
+import qualified Data.Ascii as A
 
 main :: IO ()
 main = defaultMain
@@ -33,15 +33,15 @@
 propEncDecFailure :: S.ByteString -> Bool
 propEncDecFailure bs = unsafePerformIO $ do
     key <- getDefaultKey
-    let s = encrypt key bs
-    let bs' = decrypt key $ (S.head s + 1) `S.cons` S.drop 1 s
+    let s = A.toByteString $ encrypt key bs
+    let bs' = decrypt key $ A.unsafeFromByteString $ (S.head s + 1) `S.cons` S.drop 1 s
     return $ Just bs /= bs'
 
 propAES :: S.ByteString -> S.ByteString -> Bool
 propAES key bs = decrypt key (encrypt key bs) == Just bs
 
 propAESChanges :: S.ByteString -> S.ByteString -> Bool
-propAESChanges key bs = encrypt key bs /= bs
+propAESChanges key bs = A.toByteString (encrypt key bs) /= bs
 
 caseSpecific :: Assertion
 caseSpecific = do
@@ -53,6 +53,3 @@
 
 instance Arbitrary S.ByteString where
     arbitrary = S.pack `fmap` arbitrary
-
-instance Arbitrary Word8 where
-    arbitrary = arbitraryBoundedIntegral
