diff --git a/Data/SecureMem.hs b/Data/SecureMem.hs
--- a/Data/SecureMem.hs
+++ b/Data/SecureMem.hs
@@ -252,9 +252,19 @@
 
 -- | Create a SecureMem from a bytestring
 secureMemFromByteString :: ByteString -> SecureMem
-secureMemFromByteString b = B.inlinePerformIO $ do
-    sm <- allocateSecureMem len 
+secureMemFromByteString b = pureIO $ do
+    sm <- allocateSecureMem len
     withSecureMemPtr sm $ \dst -> withBytestringPtr $ \src -> B.memcpy dst src (fromIntegral len)
     return sm
   where (fp, off, !len) = B.toForeignPtr b
         withBytestringPtr f = withForeignPtr fp $ \p -> f (p `plusPtr` off)
+{-# NOINLINE secureMemFromByteString #-}
+
+-- | Create a SecureMem from any byteable object
+secureMemFromByteable :: Byteable b => b -> SecureMem
+secureMemFromByteable bs = pureIO $ do
+    sm <- allocateSecureMem len
+    withSecureMemPtr sm $ \dst -> withBytePtr bs $ \src -> B.memcpy dst src (fromIntegral len)
+    return sm
+  where len = byteableLength bs
+{-# NOINLINE secureMemFromByteable #-}
diff --git a/securemem.cabal b/securemem.cabal
--- a/securemem.cabal
+++ b/securemem.cabal
@@ -1,5 +1,5 @@
 Name:                securemem
-Version:             0.1.5
+Version:             0.1.6
 Synopsis:            abstraction to an auto scrubbing and const time eq, memory chunk.
 Description:
     SecureMem is similar to ByteString, except that it provides a memory chunk that
