diff --git a/Data/Yaml.hs b/Data/Yaml.hs
--- a/Data/Yaml.hs
+++ b/Data/Yaml.hs
@@ -52,6 +52,7 @@
       -- ** Better error information
     , decodeEither
     , decodeEither'
+    , decodeFileEither
       -- ** More control over decoding
     , decodeHelper
     ) where
@@ -68,7 +69,7 @@
 import qualified Data.ByteString.Char8 as S8
 import qualified Data.Map as Map
 import System.IO.Unsafe (unsafePerformIO)
-import Control.Exception (try, throwIO, fromException, Exception)
+import Control.Exception (try, throwIO, fromException, Exception, SomeException, AsyncException)
 import Control.Monad.Trans.State
 import qualified Data.Conduit as C
 import qualified Data.Conduit.List as CL
@@ -142,6 +143,7 @@
                                       }
                     | InvalidYaml (Maybe YamlException)
                     | AesonException String
+                    | OtherParseException SomeException
     deriving (Show, Typeable)
 instance Exception ParseException
 
@@ -277,6 +279,32 @@
            => FilePath
            -> IO (Maybe a)
 decodeFile fp = decodeHelper (Y.decodeFile fp) >>= either throwIO (return . either (const Nothing) id)
+
+-- | A version of 'decodeFile' which should not throw runtime exceptions.
+--
+-- Since 0.8.4
+decodeFileEither
+    :: FromJSON a
+    => FilePath
+    -> IO (Either ParseException a)
+decodeFileEither fp = do
+    x <- try $ C.runResourceT $ flip evalStateT Map.empty $ Y.decodeFile fp C.$$ parse
+    case x of
+        Left e
+            | Just pe <- fromException e -> return $ Left pe
+            | Just ye <- fromException e -> return $ Left $ InvalidYaml $ Just (ye :: YamlException)
+            | shouldBeCaught e -> return $ Left $ OtherParseException e
+            | otherwise -> throwIO e
+        Right y ->
+            return $ case parseEither parseJSON y of
+                Left s -> Left $ AesonException s
+                Right v -> Right v
+  where
+    -- FIXME this function needs more thought
+    shouldBeCaught e
+        | Just (_ :: AsyncException) <- fromException e = False
+        -- Would be nice... | Just (_ :: Timeout) <- fromException e = False
+        | otherwise = True
 
 decodeEither :: FromJSON a => ByteString -> Either String a
 decodeEither bs = unsafePerformIO
diff --git a/yaml.cabal b/yaml.cabal
--- a/yaml.cabal
+++ b/yaml.cabal
@@ -1,5 +1,5 @@
 name:            yaml
-version:         0.8.3
+version:         0.8.4
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>, Anton Ageev <antage@gmail.com>,Kirill Simonov 
