diff --git a/Database/HDBC/MySQL/Connection.hsc b/Database/HDBC/MySQL/Connection.hsc
--- a/Database/HDBC/MySQL/Connection.hsc
+++ b/Database/HDBC/MySQL/Connection.hsc
@@ -120,11 +120,7 @@
         -- So we'll turn it off here and start our first transaction.
         mysql_autocommit mysql_ 0
 
-        -- XXX force a leak here. I have yet to fathom why the
-        -- references below to mysql__ don't keep the foreignPtr
-        -- alive.
-        --mysql__ <- newForeignPtr mysql_close mysql_
-        mysql__ <- newForeignPtr_ mysql_
+        mysql__ <- newForeignPtr mysql_close mysql_
         doStartTransaction mysql__
 
         return $ Connection
@@ -249,11 +245,7 @@
 
   -- If an error occurs below, we'll lose the reference to the foreign
   -- pointer and run the finalizer.
-
-  -- XXX force a leak here. I have yet to fathom why the references
-  -- below to stmt__ don't keep the foreignPtr alive.
-  --stmt__ <- newForeignPtr mysql_stmt_close stmt_
-  stmt__ <- newForeignPtr_ stmt_
+  stmt__ <- newForeignPtr mysql_stmt_close stmt_
 
   withCStringLen query $ \(query_, len) -> do
       rv <- mysql_stmt_prepare stmt_ query_ (fromIntegral len)
@@ -497,13 +489,13 @@
 -- values into a list of SqlValue types.
 fetchRow :: ForeignPtr MYSQL -> ForeignPtr MYSQL_STMT -> [MYSQL_BIND] -> IO (Maybe [Types.SqlValue])
 fetchRow mysql__ stmt__ results =
-    withForeignPtr mysql__ $ \_ ->
-        withForeignPtr stmt__ $ \stmt_ -> do
+  withForeignPtr mysql__ $ \_ ->
+      withForeignPtr stmt__ $ \stmt_ -> do
           rv <- mysql_stmt_fetch stmt_
           case rv of
             0                             -> row
             #{const MYSQL_DATA_TRUNCATED} -> row
-            #{const MYSQL_NO_DATA}        -> return Nothing
+            #{const MYSQL_NO_DATA}        -> finalizeForeignPtr stmt__ >> return Nothing
             _                             -> statementError stmt_
     where row = mapM cellValue results >>= \cells -> return $ Just cells
 
@@ -605,7 +597,9 @@
 doRun :: ForeignPtr MYSQL -> String -> [Types.SqlValue] -> IO Integer
 doRun mysql__ query params = do
   stmt <- newStatement mysql__ query
-  Types.execute stmt params
+  rv <- Types.execute stmt params
+  Types.finish stmt
+  return rv
 
 -- Issue a query "old school", without using the prepared statement
 -- API.  We use this internally to send the transaction-related
@@ -632,6 +626,7 @@
   stmt <- newStatement mysql__ "SHOW TABLES"
   Types.execute stmt []
   rows <- unfoldRows stmt
+  Types.finish stmt
   return $ map (fromSql . head) rows
       where fromSql :: Types.SqlValue -> String
             fromSql (Types.SqlString s) = s
@@ -646,6 +641,7 @@
   stmt <- newStatement mysql__ ("DESCRIBE " ++ table)
   Types.execute stmt []
   rows <- unfoldRows stmt
+  Types.finish stmt
   return $ map fromRow rows
       where fromRow :: [Types.SqlValue] -> (String, ColTypes.SqlColDesc)
             fromRow ((Types.SqlString colname)
diff --git a/HDBC-mysql.cabal b/HDBC-mysql.cabal
--- a/HDBC-mysql.cabal
+++ b/HDBC-mysql.cabal
@@ -1,7 +1,7 @@
 Name:             HDBC-mysql
 Category:         Database
 Synopsis:         MySQL driver for HDBC
-Version:          0.2
+Version:          0.3
 Description:      This package provides a MySQL driver for HDBC.
 Stability:        Experimental
 Maintainer:       Chris Waterson <waterson@maubi.net>
