diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+## 0.4.31.1
+
+* The closeConnection method for tls connections should not be called multiple
+  times [#225](https://github.com/snoyberg/http-client/issues/225)
+
 ## 0.4.31
 
 * Added length validation for RequestBodyStream [#205](https://github.com/snoyberg/http-client/pull/205)
diff --git a/Network/HTTP/Client/Connection.hs b/Network/HTTP/Client/Connection.hs
--- a/Network/HTTP/Client/Connection.hs
+++ b/Network/HTTP/Client/Connection.hs
@@ -90,7 +90,12 @@
     -- already closed connection.
     closedVar <- newIORef False
 
-    _ <- mkWeakIORef istack c
+    let close = do
+          closed <- atomicModifyIORef closedVar (\closed -> (True, closed))
+          unless closed $
+            c
+
+    _ <- mkWeakIORef istack close
     return $! Connection
         { connectionRead = do
             closed <- readIORef closedVar
@@ -113,11 +118,7 @@
               throwIO ConnectionClosed
             w x
 
-        , connectionClose = do
-            closed <- readIORef closedVar
-            unless closed $
-              c
-            writeIORef closedVar True
+        , connectionClose = close
         }
 
 socketConnection :: Socket -> Int -> IO Connection
diff --git a/http-client.cabal b/http-client.cabal
--- a/http-client.cabal
+++ b/http-client.cabal
@@ -1,5 +1,5 @@
 name:                http-client
-version:             0.4.31
+version:             0.4.31.1
 synopsis:            An HTTP client engine, intended as a base layer for more user-friendly packages.
 description:         Hackage documentation generation is not reliable. For up to date documentation, please see: <http://www.stackage.org/package/http-client>.
 homepage:            https://github.com/snoyberg/http-client
