diff --git a/Data/Conduit.hs b/Data/Conduit.hs
--- a/Data/Conduit.hs
+++ b/Data/Conduit.hs
@@ -176,11 +176,14 @@
                                         writeRef istate $ FLClosed xs
                                         return $ Open x
     close istate src c = do
-        -- Invariant: sourceClose cannot be called twice, so we will assume
-        -- it is currently open. We could add a sanity check here.
-        writeRef istate $ FLClosed []
-        _ignored <- conduitClose c
-        sourceClose src
+        -- See comment on bufferedFuseLeft for why we need to have the
+        -- following check
+        state <- readRef istate
+        case state of
+            FLClosed _ -> return ()
+            FLOpen _ -> do
+                _ignored <- conduitClose c
+                sourceClose src
 
 infixr 0 =$
 
@@ -439,9 +442,17 @@
                                         writeRef istate $ FLClosed xs
                                         return $ Open x
     close istate c = do
-        writeRef istate $ FLClosed []
-        _ignored <- conduitClose c
-        return ()
+        -- Normally we don't have to worry about double closing, as the
+        -- invariant of a source is that close is never called twice. However,
+        -- here, if the Conduit returned Finished with some data, the overall
+        -- Source will return an Open while the Conduit will be Closed.
+        -- Therefore, we have to do a check.
+        state <- readRef istate
+        case state of
+            FLClosed _ -> return ()
+            FLOpen _ -> do
+                _ignored <- conduitClose c
+                return ()
 
 bsourcePull :: Resource m => BufferedSource m a -> ResourceT m (SourceResult a)
 bsourcePull (BufferedSource src bufRef) = do
diff --git a/conduit.cabal b/conduit.cabal
--- a/conduit.cabal
+++ b/conduit.cabal
@@ -1,5 +1,5 @@
 Name:                conduit
-Version:             0.1.1
+Version:             0.1.1.1
 Synopsis:            Streaming data processing library.
 Description:
 	Conduits are an approach to the streaming data problem. It is meant as an alternative to enumerators\/iterators, hoping to address the same issues with different trade-offs based on real-world experience with enumerators. For more information, see <http://www.yesodweb.com/book/conduit>.
@@ -20,6 +20,8 @@
 extra-source-files:  test/main.hs, test/random
 
 flag debug
+    default: True
+    description: Turn on some runtime check to ensure invariants are respected.
 
 flag nohandles
 
diff --git a/test/main.hs b/test/main.hs
--- a/test/main.hs
+++ b/test/main.hs
@@ -386,5 +386,19 @@
         a @?= "abcdefg"
         b @?= []
 
+    describe "normalFuseLeft" $ do
+        it "does not double close conduit" $ do
+            x <- runResourceT $ do
+                let src = CL.sourceList ["foobarbazbin"]
+                src C.$= CB.isolate 10 C.$$ CL.head
+            x @?= Just "foobarbazb"
+
+    describe "bufferedFuseLeft" $ do
+        it "does not double close conduit" $ do
+            x <- runResourceT $ do
+                bsrc <- C.bufferSource $ CL.sourceList ["foobarbazbin"]
+                bsrc C.$= CB.isolate 10 C.$$ CL.head
+            x @?= Just "foobarbazb"
+
 it' :: String -> IO () -> Writer [Spec] ()
 it' = it
