diff --git a/simple.cabal b/simple.cabal
--- a/simple.cabal
+++ b/simple.cabal
@@ -1,5 +1,5 @@
 name:                simple
-version:             0.10.0.2
+version:             0.10.0.3
 synopsis: A minimalist web framework for the WAI server interface
 description:
 
@@ -67,7 +67,7 @@
     , directory
     , filepath
     , mime-types
-    , monad-control
+    , monad-control < 0.4
     , mtl
     , simple-templates >= 0.7.0
     , wai >= 3.0
@@ -102,7 +102,7 @@
       base < 6
     , hspec
     , HUnit
-    , monad-control
+    , monad-control < 0.4
     , mtl
     , simple
     , transformers
diff --git a/src/Web/Simple/Controller/Exception.hs b/src/Web/Simple/Controller/Exception.hs
--- a/src/Web/Simple/Controller/Exception.hs
+++ b/src/Web/Simple/Controller/Exception.hs
@@ -9,16 +9,19 @@
   runInM act `E.onException` runInM handler
 
 finally :: Controller s a -> Controller s b -> Controller s a
-finally act handler = do
-  res <- (act `onException` handler)
-  handler
-  return res
+finally act next = control $ \runInM -> E.mask $ \restore -> do
+  r <- restore (runInM act) `E.onException` (runInM next)
+  _ <- runInM next
+  return r
 
 bracket :: Controller s a -> (a -> Controller s b)
         -> (a -> Controller s c) -> Controller s c
-bracket aquire release act = do
-  a <- aquire
-  act a `finally` release a
+bracket aquire release act = control $ \runInM -> E.mask $ \restore -> do
+  let release' a = runInM $ restoreM a >>= release
+  a <- runInM aquire
+  r <- (restore $ runInM $ restoreM a >>= act) `E.onException` release' a
+  _ <- release' a
+  return r
 
 handle :: E.Exception e => (e -> Controller s a) -> Controller s a
        -> Controller s a
