diff --git a/hsdev.cabal b/hsdev.cabal
--- a/hsdev.cabal
+++ b/hsdev.cabal
@@ -1,5 +1,5 @@
 name:                hsdev
-version:             0.3.2.1
+version:             0.3.2.2
 synopsis:            Haskell development library
 description:
   Haskell development library and tool with support of autocompletion, symbol info, go to declaration, find references, hayoo search etc.
@@ -155,7 +155,7 @@
     build-depends:
       hdocs >= 0.5.2,
       haddock-api >= 2.17.4,
-      haddock-library >= 1.4.3 && < 1.7
+      haddock-library >= 1.4.3 && < 1.8
 
   if flag(hlint)
     build-depends:
@@ -198,7 +198,7 @@
     process                           >= 1.4.2.0 && < 1.7,
     regex-pcre-builtin                >= 0.94.4 && < 0.95,
     scientific                        >= 0.3.4.9 && < 0.4,
-    simple-log                        == 0.9.*,
+    simple-log                        >= 0.9.9 && < 0.10,
     sqlite-simple                     >= 0.4.13.0 && < 0.5,
     stm                               >= 2.4 && < 2.6,
     syb                               >= 0.6 && < 0.8,
diff --git a/src/HsDev/Database/Update/Types.hs b/src/HsDev/Database/Update/Types.hs
--- a/src/HsDev/Database/Update/Types.hs
+++ b/src/HsDev/Database/Update/Types.hs
@@ -15,6 +15,7 @@
 import Control.Monad.Base
 import Control.Monad.Catch
 import Control.Monad.Except
+import Control.Monad.Fail (MonadFail)
 import Control.Monad.Morph
 import Control.Monad.Reader
 import Control.Monad.Writer
@@ -119,7 +120,7 @@
 	liftIO $ inWorker w act
 
 newtype UpdateM m a = UpdateM { runUpdateM :: ReaderT UpdateState (WriterT [ModuleLocation] (ClientM m)) a }
-	deriving (Applicative, Alternative, Monad, MonadPlus, MonadIO, MonadThrow, MonadCatch, MonadMask, Functor, MonadReader UpdateState, MonadWriter [ModuleLocation])
+	deriving (Applicative, Alternative, Monad, MonadFail, MonadPlus, MonadIO, MonadThrow, MonadCatch, MonadMask, Functor, MonadReader UpdateState, MonadWriter [ModuleLocation])
 
 instance MonadTrans UpdateM where
 	lift = UpdateM . lift . lift . lift
diff --git a/src/HsDev/Server/Types.hs b/src/HsDev/Server/Types.hs
--- a/src/HsDev/Server/Types.hs
+++ b/src/HsDev/Server/Types.hs
@@ -22,6 +22,7 @@
 import Control.Monad.Base
 import Control.Monad.Catch
 import Control.Monad.Except
+import Control.Monad.Fail
 import Control.Monad.Morph
 import Control.Monad.Reader
 import Control.Monad.State
@@ -60,7 +61,7 @@
 import System.Win32.FileMapping.NamePool (Pool)
 #endif
 
-type ServerMonadBase m = (MonadIO m, MonadMask m, MonadBaseControl IO m, Alternative m, MonadPlus m)
+type ServerMonadBase m = (MonadIO m, MonadFail m, MonadMask m, MonadBaseControl IO m, Alternative m, MonadPlus m)
 
 data SessionLog = SessionLog {
 	sessionLogger :: Log,
@@ -92,7 +93,7 @@
 askSession f = liftM f getSession
 
 newtype ServerM m a = ServerM { runServerM :: ReaderT Session m a }
-	deriving (Functor, Applicative, Alternative, Monad, MonadPlus, MonadIO, MonadReader Session, MonadTrans, MonadThrow, MonadCatch, MonadMask)
+	deriving (Functor, Applicative, Alternative, Monad, MonadFail, MonadPlus, MonadIO, MonadReader Session, MonadTrans, MonadThrow, MonadCatch, MonadMask)
 
 instance (MonadIO m, MonadMask m) => MonadLog (ServerM m) where
 	askLog = ServerM $ asks (sessionLogger . sessionLog)
@@ -142,7 +143,7 @@
 askOptions f = liftM f getOptions
 
 newtype ClientM m a = ClientM { runClientM :: ServerM (ReaderT CommandOptions m) a }
-	deriving (Functor, Applicative, Alternative, Monad, MonadPlus, MonadIO, MonadThrow, MonadCatch, MonadMask)
+	deriving (Functor, Applicative, Alternative, Monad, MonadFail, MonadPlus, MonadIO, MonadThrow, MonadCatch, MonadMask)
 
 instance MonadTrans ClientM where
 	lift = ClientM . lift . lift
diff --git a/src/HsDev/Tools/Ghc/Compat.hs b/src/HsDev/Tools/Ghc/Compat.hs
--- a/src/HsDev/Tools/Ghc/Compat.hs
+++ b/src/HsDev/Tools/Ghc/Compat.hs
@@ -14,7 +14,8 @@
 	exposedModuleName,
 	exprType,
 	modSummaries,
-	cleanTemps
+	cleanTemps,
+	mgArgTys, mgResTy
 	) where
 
 import qualified BasicTypes
@@ -234,4 +235,20 @@
 cleanTemps df = do
 	SysTools.cleanTempFiles df
 	SysTools.cleanTempDirs df
+#endif
+
+mgArgTys :: GHC.MatchGroup TcId (GHC.LHsExpr TcId) -> Maybe [GHC.Type]
+#if __GLASGOW_HASKELL__ >= 806
+mgArgTys (GHC.MG{GHC.mg_ext=ext}) = Just $ GHC.mg_arg_tys ext
+mgArgTys _ = Nothing
+#else
+mgArgTys = Just . GHC.mg_arg_tys
+#endif
+
+mgResTy :: GHC.MatchGroup TcId (GHC.LHsExpr TcId) -> Maybe GHC.Type
+#if __GLASGOW_HASKELL__ >= 806
+mgResTy (GHC.MG{GHC.mg_ext=ext}) = Just $ GHC.mg_res_ty ext
+mgResTy _ = Nothing
+#else
+mgResTy = Just . GHC.mg_res_ty
 #endif
diff --git a/src/HsDev/Tools/Ghc/MGhc.hs b/src/HsDev/Tools/Ghc/MGhc.hs
--- a/src/HsDev/Tools/Ghc/MGhc.hs
+++ b/src/HsDev/Tools/Ghc/MGhc.hs
@@ -12,6 +12,7 @@
 	) where
 
 import Control.Lens
+import Control.Monad.Fail as Fail
 import Control.Monad.Morph
 import Control.Monad.Catch
 import Control.Monad.Reader
@@ -80,13 +81,16 @@
 
 -- | Multi-session ghc monad
 newtype MGhcT s d m a = MGhcT { unMGhcT :: GhcT (ReaderT (Maybe FilePath) (StateT (SessionState s d) m)) a }
-	deriving (Functor, Applicative, Monad, MonadIO, ExceptionMonad, HasDynFlags, GhcMonad, MonadState (SessionState s d), MonadReader (Maybe FilePath), MonadThrow, MonadCatch, MonadMask, MonadLog)
+	deriving (Functor, Applicative, Monad, MonadFail, MonadIO, ExceptionMonad, HasDynFlags, GhcMonad, MonadState (SessionState s d), MonadReader (Maybe FilePath), MonadThrow, MonadCatch, MonadMask, MonadLog)
 
 instance MonadTrans GhcT where
 	lift = liftGhcT
 
 instance MFunctor GhcT where
 	hoist fn = GhcT . (fn .) . unGhcT
+
+instance MonadFail m => MonadFail (GhcT m) where
+	fail = lift . Fail.fail
 
 instance MonadState st m => MonadState st (GhcT m) where
 	get = lift get
diff --git a/src/HsDev/Tools/Ghc/Types.hs b/src/HsDev/Tools/Ghc/Types.hs
--- a/src/HsDev/Tools/Ghc/Types.hs
+++ b/src/HsDev/Tools/Ghc/Types.hs
@@ -9,6 +9,7 @@
 import Control.DeepSeq
 import Control.Lens (over, view, set, each, preview, makeLenses, _Just)
 import Control.Monad
+import Control.Monad.Fail (MonadFail)
 import Control.Monad.IO.Class
 import Data.Aeson
 import Data.Generics
@@ -48,8 +49,10 @@
 			return (getLoc e, C.exprType ex)
 
 instance HasType (LHsBind TcId) where
-	getType (L _ FunBind { fun_id = fid, fun_matches = m}) = return $ Just (getLoc fid, typ) where
-		typ = mkFunTys (mg_arg_tys m) (mg_res_ty m)
+	getType (L _ FunBind { fun_id = fid, fun_matches = m}) = return $ do
+		argTys <- mgArgTys m
+		resTy <- mgResTy m
+		return (getLoc fid, mkFunTys argTys resTy)
 	getType _ = return Nothing
 
 instance HasType (LPat TcId) where
@@ -69,7 +72,7 @@
 		nameSet :: NameSet -> Bool
 		nameSet = const True
 
-moduleTypes :: GhcMonad m => Path -> m [(SrcSpan, Type)]
+moduleTypes :: (MonadFail m, GhcMonad m) => Path -> m [(SrcSpan, Type)]
 moduleTypes fpath = do
 	fpath' <- liftIO $ canonicalize fpath
 	mg <- getModuleGraph
@@ -106,7 +109,7 @@
 		v .:: "type"
 
 -- | Get all types in module
-fileTypes :: (MonadLog m, GhcMonad m) => Module -> Maybe Text -> m [Note TypedExpr]
+fileTypes :: (MonadLog m, MonadFail m, GhcMonad m) => Module -> Maybe Text -> m [Note TypedExpr]
 fileTypes m msrc = scope "types" $ case view (moduleId . moduleLocation) m of
 	FileModule file proj -> do
 		file' <- liftIO $ canonicalize file
@@ -145,5 +148,5 @@
 		return $ set (symbolInfo . functionType) (Just $ view (note . typedType) tnote) d
 
 -- | Infer types in module
-inferTypes :: (MonadLog m, GhcMonad m) => Module -> Maybe Text -> m Module
+inferTypes :: (MonadLog m, MonadFail m, GhcMonad m) => Module -> Maybe Text -> m Module
 inferTypes m msrc = scope "infer" $ liftM (`setModuleTypes` m) $ fileTypes m msrc
