diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,5 +1,6 @@
 # hw-rankselect
 [![CircleCI](https://circleci.com/gh/haskell-works/hw-rankselect.svg?style=svg)](https://circleci.com/gh/haskell-works/hw-rankselect)
+[![Travis](https://travis-ci.org/haskell-works/hw-rankselect.svg?branch=master)](https://travis-ci.org/haskell-works/hw-rankselect)
 
 Efficient `rank` and `select` operations on large bit-vectors based on the paper
 "Space-Efficient, High-Performance Rank & Select Structures on Uncompressed Bit
diff --git a/app/App/Commands/Build.hs b/app/App/Commands/Build.hs
--- a/app/App/Commands/Build.hs
+++ b/app/App/Commands/Build.hs
@@ -20,14 +20,14 @@
 runBuild :: BuildOptions -> IO ()
 runBuild opts = case opts ^. L.indexType of
   CsPoppy  -> do
-    entries <- listDirectory "data"
+    entries <- getDirectoryContents "data"
     let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
     forM_ files $ \file -> do
       putStrLn $ "Loading cspoppy for " <> file
       CS.CsPoppy !_ !_ !_ <- mmapFromForeignRegion file
       return ()
   Poppy512 -> do
-    entries <- listDirectory "data"
+    entries <- getDirectoryContents "data"
     let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
     forM_ files $ \file -> do
       putStrLn $ "Loading cspoppy for " <> file
diff --git a/app/App/Commands/SelectAll.hs b/app/App/Commands/SelectAll.hs
--- a/app/App/Commands/SelectAll.hs
+++ b/app/App/Commands/SelectAll.hs
@@ -23,7 +23,7 @@
 runSelectAll :: O.SelectAllOptions -> IO ()
 runSelectAll opts = case opts ^. L.indexType of
   O.CsPoppy -> do
-    entries <- listDirectory "data"
+    entries <- getDirectoryContents "data"
     let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
     forM_ files $ \file -> do
       putStrLn $ "Loading cspoppy for " <> file
@@ -33,7 +33,7 @@
         return ()
       return ()
   O.Poppy512 -> do
-    entries <- listDirectory "data"
+    entries <- getDirectoryContents "data"
     let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
     forM_ files $ \file -> do
       putStrLn $ "Loading cspoppy for " <> file
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -20,7 +20,7 @@
 
 runPoppy512SelectAll :: IO ()
 runPoppy512SelectAll = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   forM_ files $ \file -> do
     putStrLn $ "Loading cspoppy for " <> file
@@ -32,7 +32,7 @@
 
 runCsPoppySelectAll :: IO ()
 runCsPoppySelectAll = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   forM_ files $ \file -> do
     putStrLn $ "Loading cspoppy for " <> file
diff --git a/bench/Main.hs b/bench/Main.hs
--- a/bench/Main.hs
+++ b/bench/Main.hs
@@ -6,6 +6,7 @@
 import Control.Monad
 import Criterion.Main
 import Data.List
+import Data.Monoid ((<>))
 import Data.Word
 import HaskellWorks.Data.Bits.PopCount.PopCount1
 import HaskellWorks.Data.FromForeignRegion
@@ -29,7 +30,7 @@
 
 benchCsPoppyBuild :: IO [Benchmark]
 benchCsPoppyBuild = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return (mkBenchmark <$> files)
   where mkBenchmark filename = env (mmapFromForeignRegion filename) $ \bitString -> bgroup filename
@@ -38,7 +39,7 @@
 
 benchCsPoppyRank1 :: IO [Benchmark]
 benchCsPoppyRank1 = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return (mkBenchmark <$> files)
   where mkBenchmark filename = env (mmapFromForeignRegion filename) $ \(v :: CsPoppy) -> bgroup filename
@@ -47,7 +48,7 @@
 
 benchCsPoppySelect1 :: IO [Benchmark]
 benchCsPoppySelect1 = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return (mkBenchmark <$> files)
   where mkBenchmark filename = env (mmapFromForeignRegion filename) $ \(rsbs :: CsPoppy) -> bgroup filename
@@ -59,7 +60,7 @@
 
 benchPoppy512Build :: IO [Benchmark]
 benchPoppy512Build = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return (mkBenchmark <$> files)
   where mkBenchmark filename = env (mmapFromForeignRegion filename) $ \bitString -> bgroup filename
@@ -68,7 +69,7 @@
 
 benchPoppy512Rank1 :: IO [Benchmark]
 benchPoppy512Rank1 = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return (mkBenchmark <$> files)
   where mkBenchmark filename = env (mmapFromForeignRegion filename) $ \(rsbs :: Poppy512) -> bgroup filename
@@ -77,7 +78,7 @@
 
 benchPoppy512Select1 :: IO [Benchmark]
 benchPoppy512Select1 = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return (mkBenchmark <$> files)
   where mkBenchmark filename = env (mmapFromForeignRegion filename) $ \(rsbs :: Poppy512) -> bgroup filename
@@ -89,7 +90,7 @@
 
 runCsPoppyBuild :: IO ()
 runCsPoppyBuild = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   forM_ files $ \file -> do
     msbs :: CsPoppy <- mmapFromForeignRegion file
@@ -98,7 +99,7 @@
 
 benchMakeCsPoppyBlocks1 :: IO [Benchmark]
 benchMakeCsPoppyBlocks1 = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return (mkBenchmark <$> files)
   where mkBenchmark filename = env (mmapFromForeignRegion filename) $ \(v :: DVS.Vector Word64) -> bgroup filename
@@ -107,7 +108,7 @@
 
 benchMakeCsPoppyBlocks2 :: IO [Benchmark]
 benchMakeCsPoppyBlocks2 = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return (mkBenchmark <$> files)
   where mkBenchmark filename = env (mmapFromForeignRegion filename) $ \(v :: DVS.Vector Word64) -> bgroup filename
@@ -116,7 +117,7 @@
 
 benchMakeCsPoppyLayerM :: IO [Benchmark]
 benchMakeCsPoppyLayerM = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return (mkBenchmark <$> files)
   where mkBenchmark filename = env (mkEnv filename) $ \(v :: DVS.Vector Word64) -> bgroup filename
@@ -129,7 +130,7 @@
 
 benchGenCsSamples :: IO [Benchmark]
 benchGenCsSamples = do
-  entries <- listDirectory "data"
+  entries <- getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return (mkBenchmark <$> files)
   where mkBenchmark filename = env (mkEnv filename) $ \ ~(pc, v :: DVS.Vector Word64) -> bgroup filename
diff --git a/data/sample-000.idx b/data/sample-000.idx
new file mode 100644
Binary files /dev/null and b/data/sample-000.idx differ
diff --git a/hw-rankselect.cabal b/hw-rankselect.cabal
--- a/hw-rankselect.cabal
+++ b/hw-rankselect.cabal
@@ -1,11 +1,11 @@
--- This file has been generated from package.yaml by hpack version 0.20.0.
+-- This file has been generated from package.yaml by hpack version 0.27.0.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: b29dda4066f480c03d4e57b5948804c058cecee507ecba37e5857567b3b852fb
+-- hash: 1a884e08d826a4ac01f16811763a63e54433817022a52322a43feb446d2b9e13
 
 name:           hw-rankselect
-version:        0.12.0.2
+version:        0.12.0.3
 synopsis:       Rank-select
 description:    Please see README.md
 category:       Data, Conduit
@@ -16,11 +16,13 @@
 copyright:      2016 John Ky
 license:        BSD3
 license-file:   LICENSE
+tested-with:    GHC == 8.4.2, GHC == 8.2.2, GHC == 8.0.2, GHC == 7.10.3
 build-type:     Simple
 cabal-version:  >= 1.10
 
 extra-source-files:
     data/README.md
+    data/sample-000.idx
     README.md
 
 source-repository head
@@ -33,51 +35,32 @@
   default: False
 
 library
-  hs-source-dirs:
-      src
-  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -O2 -msse4.2
-  build-depends:
-      base >=4 && <5
-    , deepseq
-    , hw-balancedparens >=0.1.0.0
-    , hw-bits >=0.6.0.0
-    , hw-prim >=0.4.0.3
-    , hw-rankselect-base >=0.2.0.0
-    , vector
-  if (flag(bmi2)) && (impl(ghc >=8.4.1))
-    ghc-options: -mbmi2 -msse4.2
-    cpp-options: -DBMI2_ENABLED
   exposed-modules:
       HaskellWorks.Data.RankSelect.CsPoppy
       HaskellWorks.Data.RankSelect.CsPoppy.Internal
       HaskellWorks.Data.RankSelect.Poppy512
   other-modules:
       Paths_hw_rankselect
-  default-language: Haskell2010
-
-executable hw-rankselect
-  main-is: Main.hs
   hs-source-dirs:
-      app
-  default-extensions: OverloadedStrings TupleSections
-  ghc-options: -threaded -rtsopts -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -O2 -msse4.2
+      src
+  ghc-options: -Wall -O2 -msse4.2
   build-depends:
-      base >=4.7 && <5
-    , directory
-    , hw-bits >=0.4.0.0
-    , hw-prim >=0.4.0.0
-    , hw-rankselect
-    , hw-rankselect-base >=0.2.0.0
-    , lens
-    , mmap
-    , mtl
-    , optparse-applicative
-    , vector
+      base >=4 && <5
+    , deepseq >=1.4 && <1.5
+    , hw-balancedparens >=0.1.0.0 && <0.3
+    , hw-bits >=0.6.0.0 && <0.8
+    , hw-prim >=0.6 && <0.7
+    , hw-rankselect-base >=0.2.0.0 && <0.4
+    , vector >=0.12 && <0.13
   if (flag(bmi2)) && (impl(ghc >=8.4.1))
     ghc-options: -mbmi2 -msse4.2
     cpp-options: -DBMI2_ENABLED
-  if os(osx)
-    cpp-options: -D__attribute__(A)= -D_Nullable= -D_Nonnull=
+  if (impl(ghc >=8.0.1))
+    ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
+  default-language: Haskell2010
+
+executable hw-rankselect
+  main-is: Main.hs
   other-modules:
       App.Commands
       App.Commands.Build
@@ -87,31 +70,32 @@
       App.Commands.UnitTest
       App.Commands.Validate
       Paths_hw_rankselect
-  default-language: Haskell2010
-
-test-suite hw-rankselect-test
-  type: exitcode-stdio-1.0
-  main-is: Spec.hs
   hs-source-dirs:
-      test
-  ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+      app
+  default-extensions: OverloadedStrings TupleSections
+  ghc-options: -threaded -rtsopts -Wall -O2 -msse4.2
   build-depends:
-      QuickCheck
-    , base >=4 && <5
-    , directory
-    , hedgehog
-    , hspec
-    , hw-bits >=0.4.0.0
-    , hw-hedgehog >=0.1.0.1
-    , hw-hspec-hedgehog
-    , hw-prim >=0.5.0.4
+      base >=4.7 && <5
+    , directory >=1.2 && <1.4
+    , hw-bits >=0.4.0.0 && <0.8
+    , hw-prim >=0.4.0.0 && <0.7
     , hw-rankselect
-    , hw-rankselect-base >=0.2.0.0
-    , mmap
-    , vector
+    , hw-rankselect-base >=0.2.0.0 && <0.4
+    , lens >=4 && <5
+    , mmap >=0.5 && <0.6
+    , mtl >=2.2 && <2.3
+    , optparse-applicative >=0.11 && <0.15
+    , vector >=0.12 && <0.13
   if (flag(bmi2)) && (impl(ghc >=8.4.1))
     ghc-options: -mbmi2 -msse4.2
     cpp-options: -DBMI2_ENABLED
+  if (impl(ghc >=8.0.1))
+    ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
+  default-language: Haskell2010
+
+test-suite hw-rankselect-test
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
   other-modules:
       HaskellWorks.Data.RankSelect.BasicGen
       HaskellWorks.Data.RankSelect.BinarySearchSpec
@@ -125,30 +109,56 @@
       HaskellWorks.Data.RankSelect.ValidateSpec
       Test.Common
       Paths_hw_rankselect
+  hs-source-dirs:
+      test
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+  build-depends:
+      QuickCheck >=2.10 && <2.12
+    , base >=4 && <5
+    , directory >=1.2 && <1.4
+    , hedgehog >=0.5 && <0.7
+    , hspec >=2.4 && <2.6
+    , hw-bits >=0.4.0.0 && <0.8
+    , hw-hedgehog >=0.1.0.1 && <0.2
+    , hw-hspec-hedgehog >=0.1 && <0.2
+    , hw-prim >=0.5.0.4 && <0.7
+    , hw-rankselect
+    , hw-rankselect-base >=0.2.0.0 && <0.4
+    , mmap >=0.5 && <0.6
+    , transformers >=0.4 && <0.6
+    , vector >=0.12 && <0.13
+  if (flag(bmi2)) && (impl(ghc >=8.4.1))
+    ghc-options: -mbmi2 -msse4.2
+    cpp-options: -DBMI2_ENABLED
+  if (impl(ghc >=8.0.1))
+    ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   default-language: Haskell2010
+  build-tool-depends: hspec-discover:hspec-discover
 
 benchmark bench
   type: exitcode-stdio-1.0
   main-is: Main.hs
+  other-modules:
+      Paths_hw_rankselect
   hs-source-dirs:
       bench
   ghc-options: -O2 -Wall -msse4.2
   build-depends:
       base >=4 && <5
-    , bytestring
-    , conduit
-    , criterion
-    , directory
-    , hw-bits >=0.4.0.0
-    , hw-prim >=0.4.0.0
+    , bytestring >=0.10 && <0.11
+    , conduit >=1.2 && <1.4
+    , criterion >=1.1 && <1.5
+    , directory >=1.2 && <1.5
+    , hw-bits >=0.4.0.0 && <0.8
+    , hw-prim >=0.6.0.0 && <0.7
     , hw-rankselect
-    , hw-rankselect-base >=0.2.0.0
-    , mmap
-    , resourcet
-    , vector
+    , hw-rankselect-base >=0.3.1.0 && <0.4
+    , mmap >=0.5 && <0.6
+    , resourcet >=1.1 && <1.3
+    , vector >=0.12 && <0.13
   if (flag(bmi2)) && (impl(ghc >=8.4.1))
     ghc-options: -mbmi2 -msse4.2
     cpp-options: -DBMI2_ENABLED
-  other-modules:
-      Paths_hw_rankselect
+  if (impl(ghc >=8.0.1))
+    ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   default-language: Haskell2010
diff --git a/test/HaskellWorks/Data/RankSelect/CsPoppySpec.hs b/test/HaskellWorks/Data/RankSelect/CsPoppySpec.hs
--- a/test/HaskellWorks/Data/RankSelect/CsPoppySpec.hs
+++ b/test/HaskellWorks/Data/RankSelect/CsPoppySpec.hs
@@ -9,6 +9,7 @@
 import Control.Monad
 import Control.Monad.IO.Class
 import Data.Maybe
+import Data.Monoid ((<>))
 import Data.Word
 import GHC.Exts
 import HaskellWorks.Data.AtIndex
diff --git a/test/HaskellWorks/Data/RankSelect/ValidateSpec.hs b/test/HaskellWorks/Data/RankSelect/ValidateSpec.hs
--- a/test/HaskellWorks/Data/RankSelect/ValidateSpec.hs
+++ b/test/HaskellWorks/Data/RankSelect/ValidateSpec.hs
@@ -6,6 +6,7 @@
 import Control.Monad
 import Control.Monad.IO.Class
 import Data.List                                 (isSuffixOf)
+import Data.Monoid                               ((<>))
 import Data.Word
 import HaskellWorks.Data.AtIndex
 import HaskellWorks.Data.Bits.PopCount.PopCount1
@@ -26,7 +27,7 @@
 {-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}
 
 entries :: [FilePath]
-entries = mfilter (".idx" `isSuffixOf`) <$> unsafePerformIO $ IO.listDirectory "data"
+entries = mfilter (".idx" `isSuffixOf`) <$> unsafePerformIO $ IO.getDirectoryContents "data"
 
 spec :: Spec
 spec = describe "HaskellWorks.Data.RankSelect.ValidateSpec" $ do
diff --git a/test/Test/Common.hs b/test/Test/Common.hs
--- a/test/Test/Common.hs
+++ b/test/Test/Common.hs
@@ -13,7 +13,7 @@
 
 corpusFiles :: [FilePath]
 corpusFiles = IO.unsafePerformIO $ do
-  entries <- IO.listDirectory "data"
+  entries <- IO.getDirectoryContents "data"
   let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
   return files
 {-# NOINLINE corpusFiles #-}
