diff --git a/hw-rankselect-base.cabal b/hw-rankselect-base.cabal
--- a/hw-rankselect-base.cabal
+++ b/hw-rankselect-base.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 1503b4be7853227912b197998c9832b625fa280dfd157c26f2112deae20aba36
+-- hash: 62993e05ec2c3438f6c9ed9f96a5f8a6dbb0481b34e832e5cc5e02fd2929dfce
 
 name:           hw-rankselect-base
-version:        0.3.1.0
+version:        0.3.2.0
 synopsis:       Rank-select base
 description:    Please see README.md
 category:       Data
diff --git a/src/HaskellWorks/Data/RankSelect/Base/Rank1.hs b/src/HaskellWorks/Data/RankSelect/Base/Rank1.hs
--- a/src/HaskellWorks/Data/RankSelect/Base/Rank1.hs
+++ b/src/HaskellWorks/Data/RankSelect/Base/Rank1.hs
@@ -6,6 +6,7 @@
     ( Rank1(..)
     ) where
 
+import Data.Bits.BitSize
 import Data.Word
 import HaskellWorks.Data.AtIndex
 import HaskellWorks.Data.Bits.BitShown
@@ -44,40 +45,20 @@
   rank1 v i = popCount1 (v .&. ((1 .<. fromIntegral i) - 1))
   {-# INLINABLE rank1 #-}
 
-instance Rank1 [Bool] where
-  rank1 = go 0
-    where go r _ 0          = r
-          go r (True :bs) p = go (r + 1) bs (p - 1)
-          go r (False:bs) p = go  r      bs (p - 1)
-          go _ [] _         = error "Out of range"
-  {-# INLINABLE rank1 #-}
-
-instance Rank1 [Word8] where
-  rank1 v p = popCount1 prefix + if r == 0 then 0 else (`rank1` r) maybeElem
-    where (q, r)    = if p < 1 then (0, 0) else ((p - 1) `quot` elemFixedBitSize v, ((p - 1) `rem` elemFixedBitSize v) + 1)
-          prefix    = take (fromIntegral q) v
-          maybeElem = v !! fromIntegral q
-  {-# INLINABLE rank1 #-}
-
-instance Rank1 [Word16] where
-  rank1 v p = popCount1 prefix + if r == 0 then 0 else (`rank1` r) maybeElem
-    where (q, r)    = if p < 1 then (0, 0) else ((p - 1) `quot` elemFixedBitSize v, ((p - 1) `rem` elemFixedBitSize v) + 1)
-          prefix    = take (fromIntegral q) v
-          maybeElem = v !! fromIntegral q
-  {-# INLINABLE rank1 #-}
+instance Rank1 Bool where
+  rank1 True  0 = 0
+  rank1 True  1 = 1
+  rank1 False 0 = 0
+  rank1 False 1 = 0
+  rank1 _     _ = error "Invalid position for rank1"
 
-instance Rank1 [Word32] where
-  rank1 v p = popCount1 prefix + if r == 0 then 0 else (`rank1` r) maybeElem
-    where (q, r)    = if p < 1 then (0, 0) else ((p - 1) `quot` elemFixedBitSize v, ((p - 1) `rem` elemFixedBitSize v) + 1)
-          prefix    = take (fromIntegral q) v
-          maybeElem = v !! fromIntegral q
-  {-# INLINABLE rank1 #-}
+instance (PopCount1 w, Rank1 w, BitSize w) => Rank1 [w] where
+  rank1 = go 0
+    where go c (w:ws) p = if p <= bitCount w
+            then c + rank1 w p
+            else go (c + popCount1 w) ws (p - bitCount w)
+          go c [] _ = c
 
-instance Rank1 [Word64] where
-  rank1 v p = popCount1 prefix + if r == 0 then 0 else (`rank1` r) maybeElem
-    where (q, r)    = if p < 1 then (0, 0) else ((p - 1) `quot` elemFixedBitSize v, ((p - 1) `rem` elemFixedBitSize v) + 1)
-          prefix    = take (fromIntegral q) v
-          maybeElem = v !! fromIntegral q
   {-# INLINABLE rank1 #-}
 
 instance Rank1 (DV.Vector Word8) where
diff --git a/src/HaskellWorks/Data/RankSelect/Base/Select1.hs b/src/HaskellWorks/Data/RankSelect/Base/Select1.hs
--- a/src/HaskellWorks/Data/RankSelect/Base/Select1.hs
+++ b/src/HaskellWorks/Data/RankSelect/Base/Select1.hs
@@ -75,9 +75,7 @@
   {-# INLINE select1 #-}
 
 instance Select1 Bool where
-  select1 b c = if c == 1
-    then if b then 1 else 0
-    else 0
+  select1 b c = if c == 1 && b then 1 else 0
 
 instance Select1 (DVS.Vector Word8) where
   select1 v c = go 0 c 0
