diff --git a/Readme.md b/Readme.md
--- a/Readme.md
+++ b/Readme.md
@@ -15,7 +15,9 @@
 
 **Note:** as of version 1.3, LevelDB can be built as a shared library. Thus, as
 of version 0.1.0 of this library, LevelDB is no longer bundled and must be
-installed on the target system.
+installed on the target system. On many systems / distributions, the LevelDB
+library is available via the native package manager. On Windows, you may want to
+follow [these instructions](https://github.com/lamdu/lamdu/blob/1623bc38e67361d4ba4f051e23a66985a66ca52c/doc/Build.md#windows).
 
 To install the latest version from hackage:
 
diff --git a/leveldb-haskell.cabal b/leveldb-haskell.cabal
--- a/leveldb-haskell.cabal
+++ b/leveldb-haskell.cabal
@@ -1,5 +1,5 @@
 name:                leveldb-haskell
-version:             0.6.5
+version:             0.6.5.1
 synopsis:            Haskell bindings to LevelDB
 homepage:            http://github.com/kim/leveldb-haskell
 bug-reports:         http://github.com/kim/leveldb-haskell/issues
@@ -63,6 +63,8 @@
 
   hs-source-dirs:   src
 
+  if os(mingw32)
+    extra-libraries: libstdc++-6
   extra-libraries:  leveldb
 
 executable leveldb-example-comparator
@@ -75,7 +77,7 @@
                   , data-default
                   , leveldb-haskell
 
-  ghc-options:      -Wall -O -threaded -rtsopts
+  ghc-options:      -Wall -threaded -rtsopts
 
   hs-source-dirs:   examples
 
@@ -96,7 +98,7 @@
                   , data-default
                   , leveldb-haskell
 
-  ghc-options:      -Wall -O -threaded -rtsopts
+  ghc-options:      -Wall -threaded -rtsopts
 
   hs-source-dirs:   examples
 
@@ -115,7 +117,7 @@
                   , data-default
                   , leveldb-haskell
 
-  ghc-options:      -Wall -O -threaded -rtsopts
+  ghc-options:      -Wall -threaded -rtsopts
 
   hs-source-dirs:   examples
 
@@ -135,7 +137,7 @@
                   , data-default
                   , leveldb-haskell
 
-  ghc-options:      -Wall -O -threaded -rtsopts
+  ghc-options:      -Wall -threaded -rtsopts
 
   hs-source-dirs:   examples
 
@@ -166,4 +168,4 @@
                   , temporary
                   , transformers
 
-  ghc-options:      -Wall -O -rtsopts -threaded -with-rtsopts=-N
+  ghc-options:      -Wall -rtsopts -threaded -with-rtsopts=-N
diff --git a/src/Database/LevelDB/Base.hs b/src/Database/LevelDB/Base.hs
--- a/src/Database/LevelDB/Base.hs
+++ b/src/Database/LevelDB/Base.hs
@@ -66,7 +66,7 @@
 import           Data.ByteString          (ByteString)
 import           Data.ByteString.Internal (ByteString (..))
 import           Data.IORef
-import           Foreign                  hiding (void)
+import           Foreign                  hiding (free, void)
 import           Foreign.C.String         (withCString)
 
 import           Database.LevelDB.C
@@ -135,7 +135,7 @@
         if val_ptr == nullPtr
             then return Nothing
             else do res <- Just <$> BS.packCString val_ptr
-                    free val_ptr
+                    c_leveldb_free val_ptr
                     return res
   where
     prop (NumFilesAtLevel i) = "leveldb.num-files-at-level" ++ show i
@@ -214,7 +214,7 @@
             then return Nothing
             else do
                 res' <- Just <$> BS.packCStringLen (val_ptr, cSizeToInt vlen)
-                free val_ptr
+                c_leveldb_free val_ptr
                 return res'
 
 -- | Delete a key/value pair.
diff --git a/src/Database/LevelDB/C.hsc b/src/Database/LevelDB/C.hsc
--- a/src/Database/LevelDB/C.hsc
+++ b/src/Database/LevelDB/C.hsc
@@ -14,8 +14,8 @@
 module Database.LevelDB.C where
 
 import Foreign
-import Foreign.C.Types
 import Foreign.C.String
+import Foreign.C.Types
 
 #include <leveldb/c.h>
 
@@ -56,6 +56,8 @@
  }
 
 
+-- N.B. unsafe calls are used where there is no chance of blocking.
+
 foreign import ccall safe "leveldb/c.h leveldb_open"
   c_leveldb_open :: OptionsPtr -> DBName -> ErrPtr -> IO LevelDBPtr
 
@@ -137,7 +139,7 @@
 foreign import ccall safe "leveldb/c.h leveldb_iter_destroy"
   c_leveldb_iter_destroy :: IteratorPtr -> IO ()
 
-foreign import ccall safe "leveldb/c.h leveldb_iter_valid"
+foreign import ccall unsafe "leveldb/c.h leveldb_iter_valid"
   c_leveldb_iter_valid :: IteratorPtr -> IO CUChar
 
 foreign import ccall safe "leveldb/c.h leveldb_iter_seek_to_first"
@@ -155,10 +157,10 @@
 foreign import ccall safe "leveldb/c.h leveldb_iter_prev"
   c_leveldb_iter_prev :: IteratorPtr -> IO ()
 
-foreign import ccall safe "leveldb/c.h leveldb_iter_key"
+foreign import ccall unsafe "leveldb/c.h leveldb_iter_key"
   c_leveldb_iter_key :: IteratorPtr -> Ptr CSize -> IO Key
 
-foreign import ccall safe "leveldb/c.h leveldb_iter_value"
+foreign import ccall unsafe "leveldb/c.h leveldb_iter_value"
   c_leveldb_iter_value :: IteratorPtr -> Ptr CSize -> IO Val
 
 foreign import ccall safe "leveldb/c.h leveldb_iter_get_error"
@@ -352,10 +354,17 @@
 foreign import ccall safe "leveldb/c.h leveldb_cache_destroy"
   c_leveldb_cache_destroy :: CachePtr -> IO ()
 
-
 --
--- Version
+-- Utility
 --
+
+-- Calls free(ptr).
+-- REQUIRES: ptr was malloc()-ed and returned by one of the routines
+-- in this file.  Note that in certain cases (typically on Windows), you
+-- may need to call this routine instead of free(ptr) to dispose of
+-- malloc()-ed memory returned by this library. */
+foreign import ccall safe "leveldb/c.h leveldb_free"
+  c_leveldb_free :: Ptr a -> IO ()
 
 foreign import ccall unsafe "leveldb/c.h leveldb_major_version"
   c_leveldb_major_version :: IO CInt
diff --git a/test/Test/Streaming.hs b/test/Test/Streaming.hs
--- a/test/Test/Streaming.hs
+++ b/test/Test/Streaming.hs
@@ -7,6 +7,7 @@
 module Test.Streaming (tests) where
 
 import           Control.Applicative        hiding (empty)
+import           Control.Monad              (liftM2, foldM)
 import           Control.Monad.Catch
 import           Control.Monad.Identity
 import           Control.Monad.IO.Class
@@ -14,7 +15,7 @@
 import           Data.ByteString.Char8      (ByteString, singleton, unpack)
 import           Data.Default
 import           Data.Foldable              (foldMap)
-import           Data.List
+import           Data.List                  hiding (singleton)
 import           Data.Monoid
 import           Database.LevelDB.Base
 import           Database.LevelDB.Internal  (unsafeClose)
