diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Hashing with SL2
+# Hashing with SL2 [![Build Status](https://travis-ci.org/srijs/hwsl2-haskell.svg?branch=master)](https://travis-ci.org/srijs/hwsl2-haskell)
 
 An algebraic hash function, inspired by the paper _Hashing with SL2_ by Tillich and Zemor.
 
diff --git a/hwsl2.cabal b/hwsl2.cabal
--- a/hwsl2.cabal
+++ b/hwsl2.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.3.2.0
+version:             0.4.0.0
 
 -- A short (one-line) description of the package.
 synopsis:            Hashing with SL2
@@ -85,7 +85,7 @@
                        Safe Trustworthy Unsafe
 
   -- Other library packages from which modules are imported.
-  build-depends:       base >=4.7 && <4.8, bytestring >=0.10 && <0.11
+  build-depends:       base >=4.8 && <4.9, bytestring >=0.10
 
   -- Directories containing source files.
   hs-source-dirs:      src
@@ -106,19 +106,18 @@
 
 
 test-suite test
-  type:                detailed-0.9
+  type:                exitcode-stdio-1.0
   hs-source-dirs:      src
-  test-module:         Data.Hash.SL2.Test
+  main-is:             Data/Hash/SL2/Test.hs
   other-modules:       Data.Hash.SL2
                        Data.Hash.SL2.Mutable
                        Data.Hash.SL2.Unsafe
                        Data.Hash.SL2.Internal
-  build-depends:       base >=4.7 && <4.8,
-                       Cabal >=1.9.2,
-                       bytestring >=0.10 && <0.11,
-                       QuickCheck >=2.7 && <2.8,
-                       quickcheck-properties>=0.1 && <0.2,
-                       cabal-test-quickcheck>=0.1 && <0.2
+  build-depends:       base >=4.8 && <4.9,
+                       bytestring >=0.10,
+                       tasty >=0.10,
+                       tasty-quickcheck >=0.8,
+                       quickcheck-properties >= 0.1
   include-dirs:        src/core
   if flag(avx2)
     cc-options:        -Wall -O3 -mavx2 -msse4.1 -msse2 -mpclmul
@@ -135,12 +134,12 @@
                        Data.Hash.SL2.Mutable
                        Data.Hash.SL2.Unsafe
                        Data.Hash.SL2.Internal
-  build-depends:       base >=4.7 && <4.8,
+  build-depends:       base >=4.8 && <4.9,
                        Cabal >=1.9.2,
-                       bytestring >=0.10 && <0.11,
-                       criterion >=1.0 && <1.1,
-                       cryptohash >=0.11 && <0.12,
-                       parallel >=3.2 && <3.3
+                       bytestring >=0.10,
+                       criterion >=1.0,
+                       cryptohash >=0.11,
+                       parallel >=3.2
   include-dirs:        src/core
   if flag(avx2)
     cc-options:        -Wall -O3 -mavx2 -msse4.1 -msse2 -mpclmul
diff --git a/src/Data/Hash/SL2.hs b/src/Data/Hash/SL2.hs
--- a/src/Data/Hash/SL2.hs
+++ b/src/Data/Hash/SL2.hs
@@ -43,7 +43,7 @@
   , unpack8, unpack16, unpack32, unpack64
   ) where
 
-import Prelude hiding (concat, foldl, foldr)
+import Prelude hiding (concat)
 
 import Data.Hash.SL2.Internal (Hash)
 import Data.Hash.SL2.Unsafe
@@ -54,9 +54,7 @@
 import Data.ByteString (ByteString)
 
 import Data.Word
-import Data.Monoid
-import Data.Functor
-import Data.Foldable (Foldable, foldl, foldl', foldr, foldr')
+import Data.Foldable (foldl', foldr')
 
 instance Show Hash where
   show h = unsafePerformIO $ unsafeUseAsPtr h Mutable.serialize
@@ -120,7 +118,7 @@
 
 -- | /O(1)/ Parse the representation generated by 'show'.
 parse :: String -> Maybe Hash
-parse s = (\(h, r) -> h <$ r) $ unsafePerformIO $ unsafeWithNew $ Mutable.unserialize s
+parse s = uncurry (<$) $ unsafePerformIO $ unsafeWithNew $ Mutable.unserialize s
 
 -- | /O(1)/ Check a hash for bit-level validity.
 valid :: Hash -> Bool
@@ -153,16 +151,16 @@
 
 -- | /O(1)/ Unpack into list of 64 8-bit words.
 unpack8 :: Hash -> [Word8]
-unpack8 h = unsafeUnpack h
+unpack8 = unsafeUnpack
 
 -- | /O(1)/ Unpack into list of 32 16-bit words.
 unpack16 :: Hash -> [Word16]
-unpack16 h = unsafeUnpack h
+unpack16 = unsafeUnpack
 
 -- | /O(1)/ Unpack into list of 16 32-bit words.
 unpack32 :: Hash -> [Word32]
-unpack32 h = unsafeUnpack h
+unpack32 = unsafeUnpack
 
 -- | /O(1)/ Unpack into list of 8 64-bit words.
 unpack64 :: Hash -> [Word64]
-unpack64 h = unsafeUnpack h
+unpack64 = unsafeUnpack
diff --git a/src/Data/Hash/SL2/Benchmark.hs b/src/Data/Hash/SL2/Benchmark.hs
--- a/src/Data/Hash/SL2/Benchmark.hs
+++ b/src/Data/Hash/SL2/Benchmark.hs
@@ -6,7 +6,6 @@
 
 import qualified Data.ByteString as B
 import qualified Crypto.Hash.SHA256 as SHA256
-import qualified Crypto.Hash.SHA512 as SHA512
 
 import Criterion.Main
 
@@ -17,7 +16,6 @@
 main = defaultMain
   [ bench "hwsl2 append" $ whnf (append unit) bs4M
   , bench "hwsl2 prepend" $ whnf (flip prepend unit) bs4M
-  , bench "hwsl2 append parallel" $ whnf (concatAll . (parMap rpar hash)) [bs1M, bs1M, bs1M, bs1M]
+  , bench "hwsl2 append parallel" $ whnf (concatAll . parMap rpar hash) [bs1M, bs1M, bs1M, bs1M]
   , bench "sha256" $ whnf SHA256.hash bs4M
-  , bench "sha512" $ whnf SHA512.hash bs4M
   ]
diff --git a/src/Data/Hash/SL2/Internal.hs b/src/Data/Hash/SL2/Internal.hs
--- a/src/Data/Hash/SL2/Internal.hs
+++ b/src/Data/Hash/SL2/Internal.hs
@@ -4,7 +4,7 @@
 
 module Data.Hash.SL2.Internal where
 
-import Foreign.Safe
+import Foreign
 import Foreign.C.Types
 
 newtype Hash = H (ForeignPtr ())
diff --git a/src/Data/Hash/SL2/Mutable.hs b/src/Data/Hash/SL2/Mutable.hs
--- a/src/Data/Hash/SL2/Mutable.hs
+++ b/src/Data/Hash/SL2/Mutable.hs
@@ -13,13 +13,13 @@
 
 import Prelude hiding (concat)
 
-import Foreign.Safe
+import Foreign
 import Foreign.C.String
 
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe
 
-import Data.Foldable (Foldable, foldlM, foldrM)
+import Data.Foldable (foldlM, foldrM)
 
 import Data.Hash.SL2.Internal (Hash, hashLen)
 import qualified Data.Hash.SL2.Internal as Internal
diff --git a/src/Data/Hash/SL2/Test.hs b/src/Data/Hash/SL2/Test.hs
--- a/src/Data/Hash/SL2/Test.hs
+++ b/src/Data/Hash/SL2/Test.hs
@@ -1,4 +1,4 @@
-module Data.Hash.SL2.Test where
+{-# LANGUAGE ScopedTypeVariables #-}
 
 import Prelude hiding (concat)
 
@@ -10,14 +10,12 @@
 
 import qualified Data.ByteString as B
 
-import Foreign.Safe
+import Foreign
 
-import Test.QuickCheck
-import Test.QuickCheck.All
+import Test.Tasty
+import Test.Tasty.QuickCheck as QC
 import Test.QuickCheck.Property.Monoid
 
-import Distribution.TestSuite.QuickCheck
-
 import Data.Monoid
 
 instance Arbitrary B.ByteString where
@@ -26,9 +24,11 @@
 instance Arbitrary Hash where
   arbitrary = fmap hash arbitrary
 
-tests :: IO [Test]
-tests = return
+main = defaultMain tests
 
+tests :: TestTree
+tests = testGroup "Properties"
+
   [ testGroup "equality"
 
     [ testProperty "true" $
@@ -104,7 +104,7 @@
     , testGroup "multiple strings" $
 
       [ testProperty "equal to (foldl append)" $
-          \a b -> (foldl append) a b == a `foldAppend` b
+          \a (b :: [B.ByteString]) -> foldl append a b == a `foldAppend` b
       ]
 
     ]
@@ -120,7 +120,7 @@
     , testGroup "multiple strings" $
 
       [ testProperty "equal to (flip (foldr prepend)" $
-          \a b -> (flip (foldr prepend)) a b == a `foldPrepend` b
+          \(a :: [B.ByteString]) b -> foldr prepend b a == a `foldPrepend` b
       ]
 
     ]
diff --git a/src/Data/Hash/SL2/Unsafe.hs b/src/Data/Hash/SL2/Unsafe.hs
--- a/src/Data/Hash/SL2/Unsafe.hs
+++ b/src/Data/Hash/SL2/Unsafe.hs
@@ -2,7 +2,7 @@
 
 module Data.Hash.SL2.Unsafe (unsafeUseAsPtr, unsafeUseAsPtr2, unsafeWithNew, unsafePack, unsafeUnpack) where
 
-import Foreign.Safe
+import Foreign
 import System.IO.Unsafe
 
 import Data.Hash.SL2.Internal (Hash(H), hashSize)
