diff --git a/Control/Monad/Par/IO.hs b/Control/Monad/Par/IO.hs
--- a/Control/Monad/Par/IO.hs
+++ b/Control/Monad/Par/IO.hs
@@ -27,7 +27,7 @@
 
 -- | A run method which allows actual IO to occur on top of the Par
 --   monad.  Of course this means that all the normal problems of
---   parallel IO computations are present, including nondeterminsm.
+--   parallel IO computations are present, including nondeterminism.
 --
 --   A simple example program:
 --
diff --git a/Control/Monad/Par/Scheds/Direct.hs b/Control/Monad/Par/Scheds/Direct.hs
--- a/Control/Monad/Par/Scheds/Direct.hs
+++ b/Control/Monad/Par/Scheds/Direct.hs
@@ -36,6 +36,9 @@
 import Data.IORef         (IORef,newIORef,readIORef,writeIORef,atomicModifyIORef)
 import Text.Printf        (printf)
 import GHC.Conc           (numCapabilities,yield)
+import Control.Monad
+import Control.Monad.IO.Class
+import Control.Monad.Trans
 import           "mtl" Control.Monad.Cont as C
 import qualified "mtl" Control.Monad.Reader as RD
 import qualified       System.Random.MWC as Random
@@ -228,7 +231,7 @@
 
 tryWakeIdle :: HotVar [MVar Bool] -> IO ()
 tryWakeIdle idle = do
--- NOTE: I worry about having the idle var hammmered by all threads on their spawn-path:
+-- NOTE: I worry about having the idle var hammered by all threads on their spawn-path:
   -- If any worker is idle, wake one up and give it work to do.
   idles <- readHotVar idle -- Optimistically do a normal read first.
   when (not (Prelude.null idles)) $ do
@@ -658,7 +661,7 @@
 -- | Attempt to steal work or, failing that, give up and go idle.
 --
 --   The current policy is to do a burst of of N tries without
---   yielding or pausing inbetween.
+--   yielding or pausing in between.
 steal :: Sched -> IO ()
 steal mysched@Sched{ idle, scheds, rng, no=my_no } = do
   when (dbglvl>=2)$ do tid <- myThreadId
diff --git a/Control/Monad/Par/Scheds/DirectInternal.hs b/Control/Monad/Par/Scheds/DirectInternal.hs
--- a/Control/Monad/Par/Scheds/DirectInternal.hs
+++ b/Control/Monad/Par/Scheds/DirectInternal.hs
@@ -1,15 +1,20 @@
-{-# LANGUAGE PackageImports, CPP, GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE PackageImports, CPP, GeneralizedNewtypeDeriving,
+             DeriveDataTypeable #-}
 
--- | Type definiton and some helpers.  This is used mainly by
+-- | Type definition and some helpers.  This is used mainly by
 -- Direct.hs but can also be used by other modules that want access to
 -- the internals of the scheduler (i.e. the private `Par` type constructor).
 
 module Control.Monad.Par.Scheds.DirectInternal where
 
+#if !MIN_VERSION_base(4,6,0)
+import Prelude hiding (catch)
+#endif
+
 import Control.Applicative
 import "mtl" Control.Monad.Cont as C
 import qualified "mtl" Control.Monad.Reader as RD
-import Control.Monad.IO.Class (liftIO)
+import "mtl" Control.Monad.Trans (liftIO)
 
 import qualified System.Random.MWC as Random
 
@@ -20,10 +25,10 @@
 import Data.Word (Word64)
 import Data.Concurrent.Deque.Class (WSDeque)
 import Control.Monad.Fix (MonadFix (mfix))
-#if MIN_VERSION_base(4,4,0)
+#if MIN_VERSION_base(4,9,0)
 import GHC.IO.Unsafe (unsafeDupableInterleaveIO)
 #else
-import GHC.IO.Unsafe (unsafeInterleaveIO)
+import System.IO.Unsafe (unsafeInterleaveIO)
 #endif
 
 #ifdef USE_CHASELEV
@@ -32,6 +37,7 @@
 import Data.Concurrent.Deque.ChaseLev as R
 #endif
 
+import Data.Typeable (Typeable)
 import Control.Exception (Exception, throwIO, BlockedIndefinitelyOnMVar (..),
                           catch)
 
@@ -70,12 +76,12 @@
   flip RD.runReaderT sched $
     runContT (unPar (f ans)) $ \a -> liftIO (putMVar mv a) >> ar a
 
-#if !MIN_VERSION_base(4,4,0)
+#if !MIN_VERSION_base(4,9,0)
 unsafeDupableInterleaveIO :: IO a -> IO a
 unsafeDupableInterleaveIO = unsafeInterleaveIO
 #endif
 
-data FixParException = FixParException deriving Show
+data FixParException = FixParException deriving (Show, Typeable)
 instance Exception FixParException
 
 type SessionID = Word64
diff --git a/Control/Monad/Par/Scheds/TraceInternal.hs b/Control/Monad/Par/Scheds/TraceInternal.hs
--- a/Control/Monad/Par/Scheds/TraceInternal.hs
+++ b/Control/Monad/Par/Scheds/TraceInternal.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE RankNTypes, NamedFieldPuns, BangPatterns,
-             ExistentialQuantification, CPP #-}
+             ExistentialQuantification, CPP, DeriveDataTypeable #-}
 {-# OPTIONS_GHC -Wall -fno-warn-name-shadowing -fno-warn-unused-do-bind #-}
 
 -- | This module exposes the internals of the @Par@ monad so that you
@@ -17,15 +17,19 @@
    pollIVar, yield, fixPar, FixParException (..)
  ) where
 
+#if MIN_VERSION_base(4,6,0)
+import Prelude hiding (mapM, sequence, head,tail)
+#else
+import Prelude hiding (mapM, sequence, head,tail,catch)
+#endif
 
 import Control.Monad as M hiding (mapM, sequence, join)
-import Prelude hiding (mapM, sequence, head,tail)
 import Data.IORef
 import System.IO.Unsafe
-#if MIN_VERSION_base(4,4,0)
+#if MIN_VERSION_base(4,9,0)
 import GHC.IO.Unsafe (unsafeDupableInterleaveIO)
 #else
-import GHC.IO.Unsafe (unsafeInterleaveIO)
+import System.IO.Unsafe (unsafeInterleaveIO)
 #endif
 import Control.Concurrent hiding (yield)
 import GHC.Conc (numCapabilities)
@@ -33,6 +37,7 @@
 import Control.Monad.Fix (MonadFix (mfix))
 import Control.Exception (Exception, throwIO, BlockedIndefinitelyOnMVar (..),
                           catch)
+import Data.Typeable (Typeable)
 -- import Text.Printf
 
 #if !MIN_VERSION_base(4,8,0)
@@ -105,7 +110,7 @@
         r <- io
         loop (c r)
 
-data FixParException = FixParException deriving Show
+data FixParException = FixParException deriving (Show, Typeable)
 instance Exception FixParException
 
 -- | Process the next item on the work queue or, failing that, go into
@@ -213,7 +218,7 @@
     case f ans of
       Par q -> pure $ q $ \a -> LiftIO (putMVar mv a) (\ ~() -> c a)) id
 
-#if !MIN_VERSION_base(4,4,0)
+#if !MIN_VERSION_base(4,9,0)
 unsafeDupableInterleaveIO :: IO a -> IO a
 unsafeDupableInterleaveIO = unsafeInterleaveIO
 #endif
diff --git a/monad-par.cabal b/monad-par.cabal
--- a/monad-par.cabal
+++ b/monad-par.cabal
@@ -1,5 +1,5 @@
 Name:                monad-par
-Version:             0.3.5
+Version:             0.3.6
 Synopsis:            A library for parallel programming based on a monad
 
 
@@ -61,7 +61,7 @@
 Stability:           Experimental
 Category:            Control,Parallelism,Monads
 Build-type:          Simple
-Cabal-version:       >=1.8
+Cabal-version:       >=1.10
 
 extra-source-files:
      tests/AListTest.hs
@@ -91,6 +91,7 @@
   location: https://github.com/simonmar/monad-par
 
 Library
+  Default-Language: Haskell98
   Exposed-modules: 
                  -- The classic, simple monad-par interface:
                    Control.Monad.Par
@@ -160,12 +161,13 @@
 
 
 Test-Suite test-monad-par
+    Default-Language: Haskell98
     type:       exitcode-stdio-1.0
     main-is:    tests/AllTests.hs
     hs-source-dirs: tests/ ./    
     -- Run tests in parallel:
     ghc-options: -O2 -threaded -rtsopts -with-rtsopts=-N4    
-    build-depends: base >= 4 && < 5
+    build-depends: base >= 4.3 && < 5
                  , abstract-par, monad-par-extras
                  , array   >= 0.3
                  , deepseq >= 1.2
diff --git a/tests/TestHelpers.hs b/tests/TestHelpers.hs
--- a/tests/TestHelpers.hs
+++ b/tests/TestHelpers.hs
@@ -27,7 +27,7 @@
     loop !n !x             = loop (n-1) (x + x * 0.5011)
 
 -- This version watches the clock so it uses a constant amount of time
--- regadless of compile/interpret mode an opt lvl.
+-- regardless of compile/interpret mode an opt lvl.
 waste_time :: Double -> IO Double
 waste_time seconds = 
     do strt <- getCurrentTime
