diff --git a/MissingH.cabal b/MissingH.cabal
--- a/MissingH.cabal
+++ b/MissingH.cabal
@@ -1,5 +1,5 @@
 Name: MissingH
-Version: 1.1.1.0
+Version: 1.2.0.0
 License: BSD3
 Maintainer: John Goerzen <jgoerzen@complete.org>
 Author: John Goerzen
@@ -94,7 +94,7 @@
                hslogger
  If flag(splitBase)
    Build-Depends: base >= 4, base < 5, directory, random, process, old-time,
-                             containers, old-locale, array
+                             containers, old-locale, array, time
  Else
    Build-Depends: base < 3
  If ! os(windows)
diff --git a/src/Data/Bits/Utils.hs b/src/Data/Bits/Utils.hs
--- a/src/Data/Bits/Utils.hs
+++ b/src/Data/Bits/Utils.hs
@@ -48,7 +48,7 @@
 
 -}
 
-fromBytes :: (Bits a) => [a] -> a
+fromBytes :: (Bits a, Num a) => [a] -> a
 fromBytes input =
     let dofb accum [] = accum
         dofb accum (x:xs) = dofb ((shiftL accum 8) .|. x) xs
diff --git a/src/Data/MIME/Types.hs b/src/Data/MIME/Types.hs
--- a/src/Data/MIME/Types.hs
+++ b/src/Data/MIME/Types.hs
@@ -35,6 +35,7 @@
 where
 
 import qualified Data.Map as Map
+import qualified Control.Exception (try, IOException)
 import Control.Monad
 import System.IO
 import System.IO.Error
@@ -189,9 +190,9 @@
     let tryread :: MIMETypeData -> String -> IO MIMETypeData
         tryread inputobj filename =
             do
-            fn <- try (openFile filename ReadMode)
+            fn <- Control.Exception.try (openFile filename ReadMode)
             case fn of
-                    Left _ -> return inputobj
+                    Left (_ :: Control.Exception.IOException) -> return inputobj
                     Right h -> do
                                x <- hReadMIMETypes inputobj True h
                                hClose h
diff --git a/src/Data/String/Utils.hs b/src/Data/String/Utils.hs
--- a/src/Data/String/Utils.hs
+++ b/src/Data/String/Utils.hs
@@ -30,11 +30,14 @@
                         -- * Conversions
                         -- | Note: Some of these functions are aliases for functions
                         -- in "Data.List.Utils".
-                        join, split, splitWs, replace, escapeRe
+                        join, split, splitWs, replace, escapeRe,
+                        -- * Reading
+                        maybeRead
                        ) where
 
 import Data.List.Utils (startswith, endswith, join, split, replace)
 import Data.Char (isAlpha, isAscii, isDigit)
+import Data.Maybe (listToMaybe)
 import Text.Regex (mkRegex, splitRegex)
 
 wschars :: String
@@ -89,3 +92,7 @@
         = x : escapeRe xs
     -- Escape everything else
     | otherwise = '\\' : x : escapeRe xs
+
+-- | Attempts to parse a value from the front of the string.
+maybeRead :: Read a => String -> Maybe a
+maybeRead = fmap fst . listToMaybe . reads
diff --git a/src/Network/Email/Sendmail.hs b/src/Network/Email/Sendmail.hs
--- a/src/Network/Email/Sendmail.hs
+++ b/src/Network/Email/Sendmail.hs
@@ -34,6 +34,7 @@
 import System.Directory
 import System.IO
 import System.IO.Error
+import qualified Control.Exception(try, IOException)
 
 sendmails :: [String]
 sendmails = ["/usr/sbin/sendmail",
@@ -90,10 +91,10 @@
         in
         do
         --pOpen WriteToPipe "/usr/sbin/sendmail" args func
-        rv <- try (pOpen WriteToPipe "sendmail" args func)
+        rv <- Control.Exception.try (pOpen WriteToPipe "sendmail" args func)
         case rv of
             Right x -> return x
-            Left _ -> do
+            Left (_ :: Control.Exception.IOException) -> do
                       sn <- findsendmail
                       r <- pOpen WriteToPipe sn args func
                       return $! r
diff --git a/src/System/Cmd/Utils.hs b/src/System/Cmd/Utils.hs
--- a/src/System/Cmd/Utils.hs
+++ b/src/System/Cmd/Utils.hs
@@ -108,6 +108,7 @@
 import System.IO.Error
 import Control.Concurrent(forkIO)
 import Control.Exception(finally)
+import qualified Control.Exception(try, IOException)
 
 data PipeMode = ReadFromPipe | WriteToPipe
 
@@ -169,11 +170,11 @@
        let childstuff = do dupTo (snd pipepair) stdOutput
                            closeFd (fst pipepair)
                            executeFile fp True args Nothing
-       p <- try (forkProcess childstuff)
+       p <- Control.Exception.try (forkProcess childstuff)
        -- parent
        pid <- case p of
                   Right x -> return x
-                  Left e -> warnFail "pipeFrom" fp args $
+                  Left (e :: Control.Exception.IOException) -> warnFail "pipeFrom" fp args $
                             "Error in fork: " ++ show e
        closeFd (snd pipepair)
        h <- fdToHandle (fst pipepair)
@@ -218,11 +219,11 @@
        let childstuff = do dupTo (fst pipepair) stdInput
                            closeFd (snd pipepair)
                            executeFile fp True args Nothing
-       p <- try (forkProcess childstuff)
+       p <- Control.Exception.try (forkProcess childstuff)
        -- parent
        pid <- case p of
                    Right x -> return x
-                   Left e -> warnFail "pipeTo" fp args $
+                   Left (e :: Control.Exception.IOException) -> warnFail "pipeTo" fp args $
                              "Error in fork: " ++ show e
        closeFd (fst pipepair)
        h <- fdToHandle (snd pipepair)
@@ -274,11 +275,11 @@
                            dupTo (fst topair) stdInput
                            closeFd (snd topair)
                            executeFile fp True args Nothing
-       p <- try (forkProcess childstuff)
+       p <- Control.Exception.try (forkProcess childstuff)
        -- parent
        pid <- case p of
                    Right x -> return x
-                   Left e -> warnFail "pipeBoth" fp args $
+                   Left (e :: Control.Exception.IOException) -> warnFail "pipeBoth" fp args $
                              "Error in fork: " ++ show e
        closeFd (snd frompair)
        closeFd (fst topair)
@@ -546,10 +547,10 @@
 -}
         in
         do
-        p <- try (forkProcess childstuff)
+        p <- Control.Exception.try (forkProcess childstuff)
         pid <- case p of
                 Right x -> return x
-                Left e -> fail ("Error in fork: " ++ (show e))
+                Left (e :: Control.Exception.IOException) -> fail ("Error in fork: " ++ (show e))
         return pid
 
 #endif
diff --git a/src/System/IO/HVFS.hs b/src/System/IO/HVFS.hs
--- a/src/System/IO/HVFS.hs
+++ b/src/System/IO/HVFS.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, TypeSynonymInstances #-}
+{-# LANGUAGE CPP, ScopedTypeVariables, TypeSynonymInstances #-}
 {- arch-tag: HVFS main file
 Copyright (c) 2004-2011 John Goerzen <jgoerzen@complete.org>
 
@@ -52,6 +52,7 @@
                     )
 where
 
+import qualified Control.Exception (catch, IOException)
 import System.IO.HVIO
 import System.Time.Utils
 import System.IO
@@ -61,6 +62,10 @@
 import System.Time
 import System.Directory
 
+#if MIN_VERSION_directory(1,2,0)
+import Data.Time.Clock.POSIX ( utcTimeToPOSIXSeconds )
+#endif
+
 {- | Encapsulate a 'HVFSStat' result.  This is required due to Haskell
 typing restrictions.  You can get at it with:
 
@@ -209,17 +214,17 @@
     vSetCurrentDirectory fs _ = eh fs "vSetCurrentDirectory"
     vGetDirectoryContents fs _ = eh fs "vGetDirectoryContents"
     vDoesFileExist fs fp = 
-        catch (do s <- vGetFileStatus fs fp
-                  return $ withStat s vIsRegularFile
-              ) (\_ -> return False)
+        Control.Exception.catch (do s <- vGetFileStatus fs fp
+                                    return $ withStat s vIsRegularFile
+              ) (\(_ :: Control.Exception.IOException) -> return False)
     vDoesDirectoryExist fs fp = 
-        catch (do s <- vGetFileStatus fs fp
-                  return $ withStat s vIsDirectory
-              ) (\_ -> return False)
+        Control.Exception.catch (do s <- vGetFileStatus fs fp
+                                    return $ withStat s vIsDirectory
+              ) (\(_ :: Control.Exception.IOException) -> return False)
     vDoesExist fs fp =
-        catch (do s <- vGetSymbolicLinkStatus fs fp
-                  return True
-              ) (\_ -> return False)
+        Control.Exception.catch (do s <- vGetSymbolicLinkStatus fs fp
+                                    return True
+              ) (\(_ :: Control.Exception.IOException) -> return False)
     vCreateDirectory fs _ = eh fs "vCreateDirectory"
     vRemoveDirectory fs _ = eh fs "vRemoveDirectory"
     vRemoveFile fs _ = eh fs "vRemoveFile"
@@ -304,7 +309,11 @@
     vGetSymbolicLinkStatus = vGetFileStatus
 #endif
 
+#if MIN_VERSION_directory(1,2,0)
+    vGetModificationTime _ p = getModificationTime p >>= (\modUTCTime -> return $ TOD ((toEnum . fromEnum . utcTimeToPOSIXSeconds) modUTCTime) 0)
+#else
     vGetModificationTime _ = getModificationTime
+#endif
 #if !(defined(mingw32_HOST_OS) || defined(mingw32_TARGET_OS) || defined(__MINGW32__))
     vCreateSymbolicLink _ = createSymbolicLink
     vReadSymbolicLink _ = readSymbolicLink
diff --git a/src/System/IO/HVIO.hs b/src/System/IO/HVIO.hs
--- a/src/System/IO/HVIO.hs
+++ b/src/System/IO/HVIO.hs
@@ -121,6 +121,7 @@
 
 import System.IO
 import System.IO.Error
+import qualified Control.Exception (catch, IOException)
 import Control.Concurrent.MVar
 import Data.IORef
 import Foreign.Ptr
@@ -287,7 +288,7 @@
                                      x -> accum `seq` loop (accum ++ [x])
                     handler e = if isEOFError e then return accum
                                 else ioError e
-                    in catch func handler
+                    in Control.Exception.catch func handler
             in
             do firstchar <- vGetChar h
                case firstchar of
@@ -301,7 +302,7 @@
                               c `seq` return (c : next)
                     handler e = if isEOFError e then return []
                                 else ioError e
-                    in catch func handler
+                    in Control.Exception.catch func handler
             in
             do loop
 
