diff --git a/dataenc.cabal b/dataenc.cabal
--- a/dataenc.cabal
+++ b/dataenc.cabal
@@ -1,5 +1,5 @@
 name: dataenc
-version: 0.9
+version: 0.10.1
 license: LGPL
 license-file: COPYING.LESSER
 author: Magnus Therning
diff --git a/src/Codec/Binary/Base16.hs b/src/Codec/Binary/Base16.hs
--- a/src/Codec/Binary/Base16.hs
+++ b/src/Codec/Binary/Base16.hs
@@ -23,6 +23,7 @@
 module Codec.Binary.Base16
     ( encode
     , decode
+    , decode'
     , chop
     , unchop
     ) where
@@ -59,17 +60,21 @@
     in map (encodeArray !) $ foldr (\ o l -> (splitOctet o) ++ l) [] os
 
 -- {{{1 decode
--- | Decode data.
-decode :: String
-    -> Maybe [Word8]
-decode s = let
+-- | Decode data (lazy).
+decode' :: String
+    -> [Maybe Word8]
+decode' = let
         dec [] = []
-        dec (o1:o2:os) =
-                    (o1 `shiftL` 4 .|. o2) : dec os
+        dec (Just o1:Just o2:os) =
+                    Just (o1 `shiftL` 4 .|. o2) : dec os
+        dec _ = [Nothing]
     in
-        if (length s `mod` 2 == 0)
-            then liftM dec $ sequence $ map (flip M.lookup decodeMap) s
-            else Nothing
+        dec . map (flip M.lookup decodeMap)
+
+-- | Decode data (strict).
+decode :: String
+    -> Maybe [Word8]
+decode = sequence . decode'
 
 -- {{{1 chop
 -- | Chop up a string in parts.
diff --git a/src/Codec/Binary/Base32.hs b/src/Codec/Binary/Base32.hs
--- a/src/Codec/Binary/Base32.hs
+++ b/src/Codec/Binary/Base32.hs
@@ -23,6 +23,7 @@
 module Codec.Binary.Base32
     ( encode
     , decode
+    , decode'
     , chop
     , unchop
     ) where
@@ -99,38 +100,42 @@
     in (foldr (\ i s -> (encodeArray ! i) : s) "" [i1, i2, i3, i4, i5, i6, i7, i8]) ++ (encode os)
 
 -- {{{1 decode
--- | Decode data.
-decode :: String
-    -> Maybe [Word8]
-decode s = let
+-- | Decode data (lazy).
+decode' :: String
+    -> [Maybe Word8]
+decode' = let
         dec [] = []
-        dec [eo1, eo2] = [eo1 `shiftL` 3 .|. eo2 `shiftR` 2]
-        dec [eo1, eo2, eo3, eo4] = let
+        dec [Just eo1, Just eo2] = [Just (eo1 `shiftL` 3 .|. eo2 `shiftR` 2)]
+        dec [Just eo1, Just eo2, Just eo3, Just eo4] = let
                 o1 = eo1 `shiftL` 3 .|. eo2 `shiftR` 2
                 o2 = eo2 `shiftL` 6 .|. eo3 `shiftL` 1 .|. eo4 `shiftR` 4
-            in [o1, o2]
-        dec [eo1, eo2, eo3, eo4, eo5] = let
+            in [Just o1, Just o2]
+        dec [Just eo1, Just eo2, Just eo3, Just eo4, Just eo5] = let
                 o1 = eo1 `shiftL` 3 .|. eo2 `shiftR` 2
                 o2 = eo2 `shiftL` 6 .|. eo3 `shiftL` 1 .|. eo4 `shiftR` 4
                 o3 = eo4 `shiftL` 4 .|. eo5 `shiftR` 1
-            in [o1, o2, o3]
-        dec [eo1, eo2, eo3, eo4, eo5, eo6, eo7] = let
+            in [Just o1, Just o2, Just o3]
+        dec [Just eo1, Just eo2, Just eo3, Just eo4, Just eo5, Just eo6, Just eo7] = let
                 o1 = eo1 `shiftL` 3 .|. eo2 `shiftR` 2
                 o2 = eo2 `shiftL` 6 .|. eo3 `shiftL` 1 .|. eo4 `shiftR` 4
                 o3 = eo4 `shiftL` 4 .|. eo5 `shiftR` 1
                 o4 = eo5 `shiftL` 7 .|. eo6 `shiftL` 2 .|. eo7 `shiftR` 3
-            in [o1, o2, o3, o4]
-        dec (eo1:eo2:eo3:eo4:eo5:eo6:eo7:eo8:eos) = let
+            in [Just o1, Just o2, Just o3, Just o4]
+        dec (Just eo1:Just eo2:Just eo3:Just eo4:Just eo5:Just eo6:Just eo7:Just eo8:eos) = let
                 o1 = eo1 `shiftL` 3 .|. eo2 `shiftR` 2
                 o2 = eo2 `shiftL` 6 .|. eo3 `shiftL` 1 .|. eo4 `shiftR` 4
                 o3 = eo4 `shiftL` 4 .|. eo5 `shiftR` 1
                 o4 = eo5 `shiftL` 7 .|. eo6 `shiftL` 2 .|. eo7 `shiftR` 3
                 o5 = eo7 `shiftL` 5 .|. eo8
-            in o1:o2:o3:o4:o5:(dec eos)
+            in Just o1:Just o2:Just o3:Just o4:Just o5:(dec eos)
+        dec _ = [Nothing]
     in
-        if (length s `mod` 8 == 0)
-            then liftM dec $ sequence $ map (flip M.lookup decodeMap) (filter (/= '=') s)
-            else Nothing
+        dec . map (flip M.lookup decodeMap) . takeWhile (/= '=')
+
+-- | Decode data (strict).
+decode :: String
+    -> Maybe [Word8]
+decode = sequence . decode'
 
 -- {{{1 chop
 -- | Chop up a string in parts.
diff --git a/src/Codec/Binary/Base32Hex.hs b/src/Codec/Binary/Base32Hex.hs
--- a/src/Codec/Binary/Base32Hex.hs
+++ b/src/Codec/Binary/Base32Hex.hs
@@ -23,6 +23,7 @@
 module Codec.Binary.Base32Hex
     ( encode
     , decode
+    , decode'
     , chop
     , unchop
     ) where
@@ -102,38 +103,42 @@
     in (foldr (\ i s -> (encodeArray ! i) : s) "" [i1, i2, i3, i4, i5, i6, i7, i8]) ++ (encode os)
 
 -- {{{1 decode
--- | Decode data.
-decode :: String
-    -> Maybe [Word8]
-decode s = let
+-- | Decode data (lazy).
+decode' :: String
+    -> [Maybe Word8]
+decode' = let
         dec [] = []
-        dec [eo1, eo2] = [eo1 `shiftL` 3 .|. eo2 `shiftR` 2]
-        dec [eo1, eo2, eo3, eo4] = let
+        dec [Just eo1, Just eo2] = [Just (eo1 `shiftL` 3 .|. eo2 `shiftR` 2)]
+        dec [Just eo1, Just eo2, Just eo3, Just eo4] = let
                 o1 = eo1 `shiftL` 3 .|. eo2 `shiftR` 2
                 o2 = eo2 `shiftL` 6 .|. eo3 `shiftL` 1 .|. eo4 `shiftR` 4
-            in [o1, o2]
-        dec [eo1, eo2, eo3, eo4, eo5] = let
+            in [Just o1, Just o2]
+        dec [Just eo1, Just eo2, Just eo3, Just eo4, Just eo5] = let
                 o1 = eo1 `shiftL` 3 .|. eo2 `shiftR` 2
                 o2 = eo2 `shiftL` 6 .|. eo3 `shiftL` 1 .|. eo4 `shiftR` 4
                 o3 = eo4 `shiftL` 4 .|. eo5 `shiftR` 1
-            in [o1, o2, o3]
-        dec [eo1, eo2, eo3, eo4, eo5, eo6, eo7] = let
+            in [Just o1, Just o2, Just o3]
+        dec [Just eo1, Just eo2, Just eo3, Just eo4, Just eo5, Just eo6, Just eo7] = let
                 o1 = eo1 `shiftL` 3 .|. eo2 `shiftR` 2
                 o2 = eo2 `shiftL` 6 .|. eo3 `shiftL` 1 .|. eo4 `shiftR` 4
                 o3 = eo4 `shiftL` 4 .|. eo5 `shiftR` 1
                 o4 = eo5 `shiftL` 7 .|. eo6 `shiftL` 2 .|. eo7 `shiftR` 3
-            in [o1, o2, o3, o4]
-        dec (eo1:eo2:eo3:eo4:eo5:eo6:eo7:eo8:eos) = let
+            in [Just o1, Just o2, Just o3, Just o4]
+        dec (Just eo1:Just eo2:Just eo3:Just eo4:Just eo5:Just eo6:Just eo7:Just eo8:eos) = let
                 o1 = eo1 `shiftL` 3 .|. eo2 `shiftR` 2
                 o2 = eo2 `shiftL` 6 .|. eo3 `shiftL` 1 .|. eo4 `shiftR` 4
                 o3 = eo4 `shiftL` 4 .|. eo5 `shiftR` 1
                 o4 = eo5 `shiftL` 7 .|. eo6 `shiftL` 2 .|. eo7 `shiftR` 3
                 o5 = eo7 `shiftL` 5 .|. eo8
-            in o1:o2:o3:o4:o5:(dec eos)
+            in Just o1:Just o2:Just o3:Just o4:Just o5:(dec eos)
+        dec _ = [Nothing]
     in
-        if (length s `mod` 8 == 0)
-            then liftM dec $ sequence $ map (flip M.lookup decodeMap) (filter (/= '=') s)
-            else Nothing
+        dec . map (flip M.lookup decodeMap) . takeWhile (/= '=')
+
+-- | Decode data (strict).
+decode :: String
+    -> Maybe [Word8]
+decode = sequence . decode'
 
 -- {{{1 chop
 -- | Chop up a string in parts.
diff --git a/src/Codec/Binary/Base64.hs b/src/Codec/Binary/Base64.hs
--- a/src/Codec/Binary/Base64.hs
+++ b/src/Codec/Binary/Base64.hs
@@ -23,6 +23,7 @@
 module Codec.Binary.Base64
     ( encode
     , decode
+    , decode'
     , chop
     , unchop
     ) where
@@ -90,25 +91,29 @@
     in (foldr (\ i s -> (encodeArray ! i) : s) "" [i1, i2, i3, i4]) ++ encode os
 
 -- {{{1 decode
--- | Decode data.
-decode :: String
-    -> Maybe [Word8]
-decode s = let
+-- | Decode data (lazy).
+decode' :: String
+    -> [Maybe Word8]
+decode' = let
         dec [] = []
-        dec [eo1, eo2] = [eo1 `shiftL` 2 .|. eo2 `shiftR` 4]
-        dec [eo1, eo2, eo3] = let
+        dec [Just eo1, Just eo2] = [Just (eo1 `shiftL` 2 .|. eo2 `shiftR` 4)]
+        dec [Just eo1, Just eo2, Just eo3] = let
                 o1 = eo1 `shiftL` 2 .|. eo2 `shiftR` 4
                 o2 = eo2 `shiftL` 4 .|. eo3 `shiftR` 2
-            in [o1, o2]
-        dec (eo1:eo2:eo3:eo4:eos) = let
+            in [Just o1, Just o2]
+        dec (Just eo1:Just eo2:Just eo3:Just eo4:eos) = let
                 o1 = eo1 `shiftL` 2 .|. eo2 `shiftR` 4
                 o2 = eo2 `shiftL` 4 .|. eo3 `shiftR` 2
                 o3 = eo3 `shiftL` 6 .|. eo4
-            in o1:o2:o3:(dec eos)
+            in Just o1:Just o2:Just o3:(dec eos)
+        dec _ = [Nothing]
     in
-        if (length s `mod` 4 == 0)
-            then liftM dec $ sequence $ map (flip M.lookup decodeMap) (filter (/= '=') s)
-            else Nothing
+        dec . map (flip M.lookup decodeMap) . takeWhile (/= '=')
+
+-- | Decode data (strict).
+decode :: String
+    -> Maybe [Word8]
+decode = sequence . decode'
 
 -- {{{1 chop
 -- | Chop up a string in parts.
diff --git a/src/Codec/Binary/Base64Url.hs b/src/Codec/Binary/Base64Url.hs
--- a/src/Codec/Binary/Base64Url.hs
+++ b/src/Codec/Binary/Base64Url.hs
@@ -23,6 +23,7 @@
 module Codec.Binary.Base64Url
     ( encode
     , decode
+    , decode'
     , chop
     , unchop
     ) where
@@ -44,15 +45,20 @@
     in map swapUrlChar $ Base64.encode os
 
 -- {{{1 decode
--- | Decode data.
-decode :: String
-    -> Maybe [Word8]
-decode cs = let
+-- | Decode data (lazy).
+decode' :: String
+    -> [Maybe Word8]
+decode' = let
         unSwapUrlChar c = case c of
             '-' -> '+'
             '_' -> '/'
             _ -> c
-    in Base64.decode $ map unSwapUrlChar cs
+    in Base64.decode' . map unSwapUrlChar
+
+-- | Decode data (strict).
+decode :: String
+    -> Maybe [Word8]
+decode = sequence . decode'
 
 -- {{{1 chop
 -- | Chop up a string in parts.
diff --git a/src/Codec/Binary/DataEncoding.hs b/src/Codec/Binary/DataEncoding.hs
--- a/src/Codec/Binary/DataEncoding.hs
+++ b/src/Codec/Binary/DataEncoding.hs
@@ -18,13 +18,15 @@
 
 -- | Data encoding module.
 --
---   It exposes several instances of 'DataCoded', one for each data encoding
+--   It exposes several instances of 'DataCodec', one for each data encoding
 --   implemented in the library without causing the name clashing that would
 --   result from importing the individual encoding modules.
 --
 module Codec.Binary.DataEncoding
-    ( encode
+    ( DataCodec
+    , encode
     , decode
+    , decode'
     , chop
     , unchop
     , base16
@@ -50,6 +52,7 @@
 data DataCodec = DataCodec {
     encode :: [Word8] -> String,
     decode :: String -> Maybe [Word8],
+    decode' :: String -> [Maybe Word8],
     chop :: Int -> String -> [String],
     unchop :: [String] -> String
 }
@@ -61,6 +64,7 @@
 base16 = DataCodec {
     encode=Base16.encode,
     decode=Base16.decode,
+    decode'=Base16.decode',
     chop=Base16.chop,
     unchop=Base16.unchop
 }
@@ -72,6 +76,7 @@
 base32 = DataCodec {
     encode=Base32.encode,
     decode=Base32.decode,
+    decode'=Base32.decode',
     chop=Base32.chop,
     unchop=Base32.unchop
 }
@@ -83,6 +88,7 @@
 base32Hex = DataCodec {
     encode=Base32Hex.encode,
     decode=Base32Hex.decode,
+    decode'=Base32Hex.decode',
     chop=Base32Hex.chop,
     unchop=Base32Hex.unchop
 }
@@ -94,6 +100,7 @@
 base64 = DataCodec {
     encode=Base64.encode,
     decode=Base64.decode,
+    decode'=Base64.decode',
     chop=Base64.chop,
     unchop=Base64.unchop
 }
@@ -105,6 +112,7 @@
 base64Url = DataCodec {
     encode=Base64Url.encode,
     decode=Base64Url.decode,
+    decode'=Base64Url.decode',
     chop=Base64Url.chop,
     unchop=Base64Url.unchop
 }
@@ -116,6 +124,7 @@
 uu = DataCodec {
     encode=Uu.encode,
     decode=Uu.decode,
+    decode'=Uu.decode',
     chop=Uu.chop,
     unchop=Uu.unchop
 }
diff --git a/src/Codec/Binary/Uu.hs b/src/Codec/Binary/Uu.hs
--- a/src/Codec/Binary/Uu.hs
+++ b/src/Codec/Binary/Uu.hs
@@ -24,6 +24,7 @@
 module Codec.Binary.Uu
     ( encode
     , decode
+    , decode'
     , chop
     , unchop
     ) where
@@ -91,25 +92,29 @@
     in (foldr (\ i s -> (encodeArray ! i) : s) "" [i1, i2, i3, i4]) ++ encode os
 
 -- {{{1 decode
--- | Decode data.
-decode :: String
-    -> Maybe [Word8]
-decode s = let
+-- | Decode data (lazy).
+decode' :: String
+    -> [Maybe Word8]
+decode' = let
         dec [] = []
-        dec [eo1, eo2] = [eo1 `shiftL` 2 .|. eo2 `shiftR` 4]
-        dec [eo1, eo2, eo3] = let
+        dec [Just eo1, Just eo2] = [Just (eo1 `shiftL` 2 .|. eo2 `shiftR` 4)]
+        dec [Just eo1, Just eo2, Just eo3] = let
                 o1 = eo1 `shiftL` 2 .|. eo2 `shiftR` 4
                 o2 = eo2 `shiftL` 4 .|. eo3 `shiftR` 2
-            in [o1, o2]
-        dec (eo1:eo2:eo3:eo4:eos) = let
+            in [Just o1, Just o2]
+        dec (Just eo1:Just eo2:Just eo3:Just eo4:eos) = let
                 o1 = eo1 `shiftL` 2 .|. eo2 `shiftR` 4
                 o2 = eo2 `shiftL` 4 .|. eo3 `shiftR` 2
                 o3 = eo3 `shiftL` 6 .|. eo4
-            in o1:o2:o3:(dec eos)
+            in Just o1:Just o2:Just o3:(dec eos)
+        dec _ = [Nothing]
     in
-        if (length s `mod` 4 /= 1)
-            then liftM dec $ sequence $ map (flip M.lookup decodeMap) s
-            else Nothing
+        dec . map (flip M.lookup decodeMap)
+
+-- | Decode data (strict).
+decode :: String
+    -> Maybe [Word8]
+decode = sequence . decode'
 
 -- {{{1 chop
 -- | Chop up a string in parts.  Each string in the resulting list is prepended
