diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.14.14
+
+* Fix bounds issues with empty strings in base64 and base32
+* Improve tests compatibility w.r.t old basement version
+
 ## 0.14.13
 
 * Handle compat SPECIALIZE for older GHC
diff --git a/Data/Memory/Encoding/Base32.hs b/Data/Memory/Encoding/Base32.hs
--- a/Data/Memory/Encoding/Base32.hs
+++ b/Data/Memory/Encoding/Base32.hs
@@ -58,7 +58,7 @@
          -> Int -- index output
          -> IO ()
     loop i di
-        | i >  len  = return ()
+        | i >= len  = return ()
         | otherwise = do
             i1 <- peekByteOff src i
             i2 <- peekOrZero (i + 1)
@@ -111,6 +111,7 @@
 -- if the length is not a multiple of 8, Nothing is returned
 unBase32Length :: Ptr Word8 -> Int -> IO (Maybe Int)
 unBase32Length src len
+    | len < 1            = return $ Just 0
     | (len `mod` 8) /= 0 = return Nothing
     | otherwise          = do
         last1Byte <- peekByteOff src (len - 1)
@@ -250,4 +251,3 @@
                  \\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\
                  \\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\
                  \\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"#
-
diff --git a/Data/Memory/Encoding/Base64.hs b/Data/Memory/Encoding/Base64.hs
--- a/Data/Memory/Encoding/Base64.hs
+++ b/Data/Memory/Encoding/Base64.hs
@@ -104,7 +104,7 @@
 -- if the length is not a multiple of 4, Nothing is returned
 unBase64Length :: Ptr Word8 -> Int -> IO (Maybe Int)
 unBase64Length src len
-    | len < 1            = return Nothing
+    | len < 1            = return $ Just 0
     | (len `mod` 4) /= 0 = return Nothing
     | otherwise          = do
         last1Byte <- peekByteOff src (len - 1)
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -50,9 +50,11 @@
 
 On the following haskell versions:
 
-* GHC 7.0.x
-* GHC 7.4.x
-* GHC 7.6.x
-* GHC 7.8.x
-* GHC 7.10.x
+* GHC 7.10
+* GHC 8.0
+* GHC 8.2
+
+Some older versions or different systems are possibly working too
+
+
 
diff --git a/memory.cabal b/memory.cabal
--- a/memory.cabal
+++ b/memory.cabal
@@ -1,5 +1,5 @@
 Name:                memory
-version:             0.14.13
+version:             0.14.14
 Synopsis:            memory and related abstraction stuff
 Description:
     Chunk of memory, polymorphic byte array management and manipulation
@@ -110,6 +110,7 @@
                      SipHash
                      Utils
   Build-Depends:     base >= 3 && < 5
+                   , bytestring
                    , tasty
                    , tasty-quickcheck
                    , tasty-hunit
diff --git a/tests/Tests.hs b/tests/Tests.hs
--- a/tests/Tests.hs
+++ b/tests/Tests.hs
@@ -7,6 +7,7 @@
 import           Utils
 import           Data.Char                    (chr)
 import           Data.Word
+import qualified Data.ByteString         as BS
 import           Data.ByteArray               (Bytes, ScrubbedBytes, ByteArray)
 import qualified Data.ByteArray          as B
 import qualified Data.ByteArray.Encoding as B
@@ -16,14 +17,19 @@
 
 #ifdef WITH_FOUNDATION_SUPPORT
 import qualified Foundation as F
+#if MIN_VERSION_basement(0,0,5)
 import           Basement.Block (Block)
+#endif
 import           Basement.UArray (UArray)
 #endif
 
 data Backend = BackendByte | BackendScrubbedBytes
 #ifdef WITH_FOUNDATION_SUPPORT
-    | BackendBlock | BackendUArray
+#if MIN_VERSION_basement(0,0,5)
+    | BackendBlock
 #endif
+    | BackendUArray
+#endif
     deriving (Show,Eq,Bounded,Enum)
 
 allBackends :: [Backend]
@@ -38,7 +44,9 @@
         BackendByte          -> ArbitraryBS `fmap` ((B.pack `fmap` replicateM n arbitrary) :: Gen Bytes)
         BackendScrubbedBytes -> ArbitraryBS `fmap` ((B.pack `fmap` replicateM n arbitrary) :: Gen ScrubbedBytes)
 #ifdef WITH_FOUNDATION_SUPPORT
+#if MIN_VERSION_basement(0,0,5)
         BackendBlock         -> ArbitraryBS `fmap` ((B.pack `fmap` replicateM n arbitrary) :: Gen (Block Word8))
+#endif
         BackendUArray        -> ArbitraryBS `fmap` ((B.pack `fmap` replicateM n arbitrary) :: Gen (UArray Word8))
 #endif
 
@@ -69,7 +77,7 @@
 #if MIN_VERSION_basement(0,0,5)
         , testGroup "Block" (l withBlockWitness)
 #endif
-        , testGroup "UArray" (l withBlockWitness)
+        , testGroup "UArray" (l withUArrayWitness)
 #endif
         ]
 
@@ -92,6 +100,7 @@
     , ("easure.", "ZWFzdXJlLg==")
     , ("asure.", "YXN1cmUu")
     , ("sure.", "c3VyZS4=")
+    , ("", "")
     ]
 
 base64URLKats =
@@ -161,6 +170,28 @@
                 outbs = B.convertFromBase base $ witnessID $ B.pack $ unS out
              in Right inpbs @=? outbs
 
+-- check not to touch internal null pointer of the empty ByteString
+bsNullEncodingTest =
+    testGroup "BS-null"
+      [ testGroup "BASE64"
+        [ testCase "encode-KAT" $ toTest B.Base64
+        , testCase "decode-KAT" $ toBackTest B.Base64
+        ]
+      , testGroup "BASE32"
+        [ testCase "encode-KAT" $ toTest B.Base32
+        , testCase "decode-KAT" $ toBackTest B.Base32
+        ]
+      , testGroup "BASE16"
+        [ testCase "encode-KAT" $ toTest B.Base16
+        , testCase "decode-KAT" $ toBackTest B.Base16
+        ]
+      ]
+  where
+    toTest base =
+      B.convertToBase base BS.empty @=? BS.empty
+    toBackTest base =
+      B.convertFromBase base BS.empty @=? Right BS.empty
+
 parsingTests witnessID =
     [ testCase "parse" $
         let input = witnessID $ B.pack $ unS "xx abctest"
@@ -174,6 +205,7 @@
 
 main = defaultMain $ testGroup "memory"
     [ localOption (QuickCheckTests 5000) $ testGroupBackends "basic" basicProperties
+    , bsNullEncodingTest
     , testGroupBackends "encoding" encodingTests
     , testGroupBackends "parsing" parsingTests
     , testGroupBackends "hashing" $ \witnessID ->
