diff --git a/Control/Monad/Parallel.hs b/Control/Monad/Parallel.hs
--- a/Control/Monad/Parallel.hs
+++ b/Control/Monad/Parallel.hs
@@ -61,7 +61,8 @@
 
 import Prelude ()
 import Control.Concurrent (forkIO)
-import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)
+import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar, readMVar)
+import Control.Exception (SomeException, throwIO, mask, try)
 import Control.Monad (Monad, (>>=), return, liftM)
 import Control.Monad.Trans.Identity (IdentityT(IdentityT, runIdentityT))
 import Control.Monad.Trans.Maybe (MaybeT(MaybeT, runMaybeT))
@@ -69,7 +70,7 @@
 import Control.Monad.Trans.List (ListT(ListT, runListT))
 import Control.Monad.Trans.Reader (ReaderT(ReaderT, runReaderT))
 import Control.Parallel (par, pseq)
-import Data.Either (Either(..))
+import Data.Either (Either(..), either)
 import Data.Function (($), (.), const)
 import Data.Functor.Identity (Identity)
 import Data.Int (Int)
@@ -144,10 +145,9 @@
 
 -- | IO is parallelizable by `forkIO`.
 instance MonadParallel IO where
-   bindM2 f ma mb = do vb <- newEmptyMVar
-                       _ <- forkIO (mb >>= putMVar vb)
+   bindM2 f ma mb = do waitForB <- forkExec mb
                        a <- ma
-                       b <- takeMVar vb
+                       b <- waitForB
                        f a b
 
 instance MonadParallel m => MonadParallel (IdentityT m) where
@@ -183,9 +183,10 @@
 
 -- | IO is forkable by `forkIO`.
 instance MonadFork IO where
-   forkExec ma = do v <- newEmptyMVar
-                    _ <- forkIO (ma >>= putMVar v)
-                    return (takeMVar v)
+   forkExec ma = do
+      v <- newEmptyMVar
+      _ <- mask $ \restore -> forkIO $ try (restore ma) >>= putMVar v
+      return $ readMVar v >>= either (\e -> throwIO (e :: SomeException)) return
 
 instance MonadFork m => MonadFork (IdentityT m) where
    forkExec ma = IdentityT (liftM IdentityT $ forkExec (runIdentityT ma))
diff --git a/monad-parallel.cabal b/monad-parallel.cabal
--- a/monad-parallel.cabal
+++ b/monad-parallel.cabal
@@ -1,5 +1,5 @@
 Name:                monad-parallel
-Version:             0.7
+Version:             0.7.1
 Cabal-Version:       >= 1.2
 Build-Type:          Simple
 Synopsis:            Parallel execution of monadic computations
@@ -12,7 +12,7 @@
   
 License:             GPL
 License-file:        LICENSE.txt
-Copyright:           (c) 2010 Mario Blazevic
+Copyright:           (c) 2010-2011 Mario Blazevic
 Author:              Mario Blazevic
 Maintainer:          blamario@yahoo.com
 Homepage:            http://trac.haskell.org/SCC/wiki/monad-parallel
