diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,14 @@
 # Revision history for base16
 
+
+## 0.1.2 -- 2020-02-17
+
+* Unmask loops - now correct.
+
+## 0.1.1 -- 2020-02-17
+
+* Mask `Word32` and `Word64` loops (flaky)
+
 ## 0.1.0.0 -- 2020-02-16
 
 * First version. Released on an unsuspecting world.
diff --git a/base16.cabal b/base16.cabal
--- a/base16.cabal
+++ b/base16.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.0
 name:               base16
-version:            0.1.1
+version:            0.1.2
 synopsis:           RFC 4648-compliant Base16 encodings/decodings
 description:
   RFC 4648-compliant Base16 encodings and decodings.
diff --git a/src/Data/ByteString/Base16/Internal/Head.hs b/src/Data/ByteString/Base16/Internal/Head.hs
--- a/src/Data/ByteString/Base16/Internal/Head.hs
+++ b/src/Data/ByteString/Base16/Internal/Head.hs
@@ -13,13 +13,13 @@
 
 import Data.ByteString.Internal
 import Data.ByteString.Base16.Internal.Tables
--- #if WORD_SIZE_IN_BITS >= 32
--- import Data.ByteString.Base16.Internal.W32.Loop
--- #elif WORD_SIZE_IN_BITS >= 64
--- import Data.ByteString.Base16.Internal.W64.Loop
--- #else
+#if WORD_SIZE_IN_BITS == 32
+import Data.ByteString.Base16.Internal.W32.Loop
+#elif WORD_SIZE_IN_BITS >= 64
+import Data.ByteString.Base16.Internal.W64.Loop
+#else
 import Data.ByteString.Base16.Internal.W16.Loop
--- #endif
+#endif
 import Data.Text (Text)
 
 import Foreign.Ptr
diff --git a/src/Data/ByteString/Base16/Internal/W32/Loop.hs b/src/Data/ByteString/Base16/Internal/W32/Loop.hs
--- a/src/Data/ByteString/Base16/Internal/W32/Loop.hs
+++ b/src/Data/ByteString/Base16/Internal/W32/Loop.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiWayIf #-}
 {-# LANGUAGE TypeApplications #-}
 -- |
 -- Module       : Data.ByteString.Base16.Internal.W32.Loop
@@ -98,6 +99,10 @@
   -> IO (Either Text ByteString)
 decodeLoop !dfp !hi !lo !dptr !sptr !end = go dptr sptr 0
   where
+    err !src = return . Left . T.pack
+      $ "invalid character at offset: "
+      ++ show (src `minusPtr` sptr)
+
     tailRound16 !dst !src !n
       | src == end = return (Right (PS dfp 0 n))
       | otherwise = do
@@ -135,11 +140,11 @@
 
         let !zz = fromIntegral (a .|. b)
                .|. (unsafeShiftL (fromIntegral (c .|. d)) 8)
-
-        if a .|. b .|. c .|. d == 0xff
-        then return . Left . T.pack
-          $ "invalid character at offset: "
-          ++ show (src `minusPtr` sptr)
-        else do
-          poke @Word16 dst zz
-          go (plusPtr dst 2) (plusPtr src 4) (n + 2)
+        if
+          | a == 0xff -> err src
+          | b == 0xff -> err (plusPtr src 1)
+          | c == 0xff -> err (plusPtr src 2)
+          | d == 0xff -> err (plusPtr src 3)
+          | otherwise -> do
+            poke @Word16 dst zz
+            go (plusPtr dst 2) (plusPtr src 4) (n + 2)
diff --git a/src/Data/ByteString/Base16/Internal/W64/Loop.hs b/src/Data/ByteString/Base16/Internal/W64/Loop.hs
--- a/src/Data/ByteString/Base16/Internal/W64/Loop.hs
+++ b/src/Data/ByteString/Base16/Internal/W64/Loop.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiWayIf #-}
 {-# LANGUAGE TypeApplications #-}
 -- |
 -- Module       : Data.ByteString.Base16.Internal.W64.Loop
@@ -141,6 +142,10 @@
   -> IO (Either Text ByteString)
 decodeLoop !dfp !hi !lo !dptr !sptr !end = go dptr sptr 0
   where
+    err !src = return . Left . T.pack
+      $ "invalid character at offset: "
+      ++ show (src `minusPtr` sptr)
+
     tailRound16 !dst !src !n
       | src == end = return (Right (PS dfp 0 n))
       | otherwise = do
@@ -150,16 +155,15 @@
         !a <- peekByteOff @Word8 hi (fromIntegral x)
         !b <- peekByteOff @Word8 lo (fromIntegral y)
 
-        if a == 0xff || b == 0xff
-        then return . Left . T.pack
-          $ "invalid character at offset: "
-          ++ show (src `minusPtr` sptr)
-        else do
-          poke dst (a .|. b)
-          go (plusPtr dst 1) (plusPtr src 2) (n + 1)
+        if
+          | a == 0xff -> err src
+          | b == 0xff -> err (plusPtr src 1)
+          | otherwise -> do
+            poke dst (a .|. b)
+            go (plusPtr dst 1) (plusPtr src 2) (n + 1)
 
     tailRound32 !dst !src !n
-      | plusPtr src 4 >= end = tailRound16 (castPtr dst) (castPtr src) n
+      | plusPtr src 3 >= end = tailRound16 (castPtr dst) (castPtr src) n
       | otherwise = do
 #ifdef WORDS_BIGENDIAN
         !t <- peek @Word32 src
@@ -176,21 +180,20 @@
         !c <- peekByteOff @Word8 hi y
         !d <- peekByteOff @Word8 lo z
 
-        let !xx = fromIntegral (a .|. b)
-            !yy = fromIntegral (c .|. d)
-
-        let !zz = xx .|. (unsafeShiftL yy 8)
+        let !zz = fromIntegral (a .|. b)
+               .|. (unsafeShiftL (fromIntegral (c .|. d)) 8)
 
-        if a .|. b .|. c .|. d == 0xff
-        then return . Left . T.pack
-          $ "invalid character at offset: "
-          ++ show (src `minusPtr` sptr)
-        else do
-          poke @Word16 dst zz
-          go (plusPtr dst 2) (plusPtr src 4) (n + 2)
+        if
+          | a == 0xff -> err src
+          | b == 0xff -> err (plusPtr src 1)
+          | c == 0xff -> err (plusPtr src 2)
+          | d == 0xff -> err (plusPtr src 3)
+          | otherwise -> do
+            poke @Word16 dst zz
+            go (plusPtr dst 2) (plusPtr src 4) (n + 2)
 
     go !dst !src !n
-      | plusPtr src 8 >= end = tailRound32 (castPtr dst) (castPtr src) n
+      | plusPtr src 7 >= end = tailRound32 (castPtr dst) (castPtr src) n
       | otherwise = do
 #ifdef WORDS_BIGENDIAN
         !tt <- peek @Word64 src
@@ -220,10 +223,15 @@
                .|. (unsafeShiftL (fromIntegral (e .|. f)) 16)
                .|. (unsafeShiftL (fromIntegral (g .|. h)) 24)
 
-        if a .|. b .|. c .|. d .|. e .|. f .|. g .|. h == 0xff
-        then return . Left . T.pack
-          $ "invalid character at offset: "
-          ++ show (src `minusPtr` sptr)
-        else do
-          poke @Word32 dst zz
-          go (plusPtr dst 4) (plusPtr src 8) (n + 4)
+        if
+          | a == 0xff -> err src
+          | b == 0xff -> err (plusPtr src 1)
+          | c == 0xff -> err (plusPtr src 2)
+          | d == 0xff -> err (plusPtr src 3)
+          | e == 0xff -> err (plusPtr src 4)
+          | f == 0xff -> err (plusPtr src 5)
+          | g == 0xff -> err (plusPtr src 6)
+          | h == 0xff -> err (plusPtr src 7)
+          | otherwise -> do
+            poke @Word32 dst zz
+            go (plusPtr dst 4) (plusPtr src 8) (n + 4)
