diff --git a/src/Parser/Incremental.hs b/src/Parser/Incremental.hs
--- a/src/Parser/Incremental.hs
+++ b/src/Parser/Incremental.hs
@@ -182,6 +182,8 @@
 instance Monad (Parser s) where
     (>>=) = Bind
     return = pure
+
+instance MonadFail (Parser s) where
     fail _message = Empt
 
 toQ :: Parser s a -> forall h r. ((h,a) -> Steps s r)  -> h -> Steps s r
diff --git a/src/Yi/CompletionTree.hs b/src/Yi/CompletionTree.hs
--- a/src/Yi/CompletionTree.hs
+++ b/src/Yi/CompletionTree.hs
@@ -85,7 +85,9 @@
         (hasParent, rest) -> over unCompletionTree (M.insert parent (fromList $
            map (fromJust . LL.stripPrefix parent) hasParent)) $ fromList rest
       -- A parent is the prefix and the children are the items with the parent as prefix
-      where childrenIn list parent = length $ filter (parent `LL.isPrefixOf`) list
+      where
+        childrenIn :: (ListLike a i, Eq i) => [a] -> a -> Int
+        childrenIn list parent = length $ filter (parent `LL.isPrefixOf`) list
 
 -- | The largest element of a non-empty structure with respect to the
 -- given comparison function, Nothing if there are multiple 'largest' elements.
@@ -178,6 +180,7 @@
   | mempty == ct = []
   | otherwise = toList' ct
   where
+    toList' :: (Ord a, ListLike a i) => CompletionTree a -> [a]
     toList' (CompletionTree ct')
       | M.null ct' = [mempty]
       | otherwise = concat $ M.elems $ M.mapWithKey (\k v -> map (k `LL.append`) $ toList' v) ct'
diff --git a/src/Yi/Interact.hs b/src/Yi/Interact.hs
--- a/src/Yi/Interact.hs
+++ b/src/Yi/Interact.hs
@@ -126,9 +126,11 @@
 
 instance Monad (I event w) where
   return  = Returns
-  fail _  = Fails
   (>>=)   = Binds
 
+instance MonadFail (I event w) where
+  fail _  = Fails
+
 instance Eq w => MonadPlus (I event w) where
   mzero = Fails
   mplus = Plus
@@ -294,7 +296,7 @@
 
 -- ---------------------------------------------------------------------------
 -- Derived operations
-oneOf :: (Ord event, MonadInteract m w event) => [event] -> m event
+oneOf :: (Ord event, MonadInteract m w event, MonadFail m) => [event] -> m event
 oneOf s = choice $ map event s
 
 anyEvent :: (Ord event, MonadInteract m w event) => m event
@@ -311,7 +313,7 @@
 -- ^ Parses and returns the specified list of events (lazily).
 events = mapM event
 
-choice :: (MonadInteract m w e) => [m a] -> m a
+choice :: (MonadInteract m w e, MonadFail m) => [m a] -> m a
 -- ^ Combines all parsers in the specified list.
 choice []     = fail "No choice succeeds"
 choice [p]    = p
diff --git a/src/Yi/Keymap/Keys.hs b/src/Yi/Keymap/Keys.hs
--- a/src/Yi/Keymap/Keys.hs
+++ b/src/Yi/Keymap/Keys.hs
@@ -33,7 +33,7 @@
 import Yi.Interact   hiding (write)
 import Yi.Keymap     (Action, KeymapM, YiAction, write)
 
-printableChar :: (MonadInteract m w Event) => m Char
+printableChar :: (MonadFail m, MonadInteract m w Event) => m Char
 printableChar = do
   Event (KASCII c) [] <- anyEvent
   unless (isPrint c) $
@@ -50,7 +50,7 @@
 pString :: (MonadInteract m w Event) => String -> m [Event]
 pString = events . map char
 
-charOf :: (MonadInteract m w Event) => (Event -> Event) -> Char -> Char -> m Char
+charOf :: (MonadFail m, MonadInteract m w Event) => (Event -> Event) -> Char -> Char -> m Char
 charOf modifier l h =
     do Event (KASCII c) _ <- eventBetween (modifier $ char l) (modifier $ char h)
        return c
@@ -84,7 +84,7 @@
 hyperCh = hyper . char
 
 -- | @optMod f ev@ produces a 'MonadInteract' that consumes @ev@ or @f ev@
-optMod ::(MonadInteract m w Event) => (Event -> Event) -> Event -> m Event
+optMod ::(MonadFail m, MonadInteract m w Event) => (Event -> Event) -> Event -> m Event
 optMod f ev = oneOf [ev, f ev]
 
 -- | Convert a special key into an event
diff --git a/src/Yi/Types.hs b/src/Yi/Types.hs
--- a/src/Yi/Types.hs
+++ b/src/Yi/Types.hs
@@ -124,7 +124,7 @@
 -- TODO: doc how these are actually user-bindable
 -- are they?
 newtype YiM a = YiM {runYiM :: ReaderT Yi IO a}
-    deriving (Monad, Applicative, MonadReader Yi, MonadBase IO, Typeable, Functor)
+    deriving (Monad, Applicative, MonadReader Yi, MonadBase IO, Typeable, Functor, MonadFail)
 
 instance MonadState Editor YiM where
     get = yiEditor <$> (liftBase . readMVar =<< yiVar <$> ask)
@@ -171,6 +171,9 @@
              , MonadState FBuffer
              , MonadReader Window )
 
+instance MonadFail BufferM where
+   fail = error
+
 -- | Currently duplicates some of Vim's indent settings. Allowing a
 -- buffer to specify settings that are more dynamic, perhaps via
 -- closures, could be useful.
@@ -361,6 +364,9 @@
 instance MonadEditor EditorM where
     askCfg = ask
     withEditor = id
+
+instance MonadFail EditorM where
+   fail = error
 
 class (Monad m, MonadState Editor m) => MonadEditor m where
   askCfg :: m Config
diff --git a/yi-core.cabal b/yi-core.cabal
--- a/yi-core.cabal
+++ b/yi-core.cabal
@@ -1,5 +1,5 @@
 name:           yi-core
-version:        0.18.0
+version:        0.19.0
 synopsis:       Yi editor core library
 category:       Yi
 homepage:       https://github.com/yi-editor/yi#readme
@@ -51,7 +51,7 @@
     , unix-compat >= 0.1
     , unordered-containers >= 0.1.3
     , xdg-basedir >= 0.2.1
-    , yi-language >= 0.18
+    , yi-language >= 0.19
     , yi-rope >= 0.10
     , exceptions
   if flag(hint)
