diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,11 @@
 
+5.37
+----
+
+* The Xterm backend is now used when `TERM` matches `rxvt` or `tmux`.
+* PictureToSpans now uses `error`, not `fail`, to avoid dependence on
+  soon-to-be-removed `MonadFail` instance for `ST` (#248)
+
 5.36
 ----
 
diff --git a/src/Graphics/Vty/Attributes/Color.hs b/src/Graphics/Vty/Attributes/Color.hs
--- a/src/Graphics/Vty/Attributes/Color.hs
+++ b/src/Graphics/Vty/Attributes/Color.hs
@@ -125,7 +125,7 @@
     term <- catch (Just <$> Terminfo.setupTerm termName')
                   (\(_ :: Terminfo.SetupTermError) -> return Nothing)
     let getCap cap = term >>= \t -> Terminfo.getCapability t cap
-        termColors = fromMaybe 0 $ getCap (Terminfo.tiGetNum "colors")
+        termColors = fromMaybe 0 $! getCap (Terminfo.tiGetNum "colors")
     colorterm <- lookupEnv "COLORTERM"
     return $ if
         | termColors <  8               -> NoColor
diff --git a/src/Graphics/Vty/Output.hs b/src/Graphics/Vty/Output.hs
--- a/src/Graphics/Vty/Output.hs
+++ b/src/Graphics/Vty/Output.hs
@@ -55,15 +55,15 @@
 --
 -- Selection of a terminal is done as follows:
 --
---      * If TERM contains "xterm" or "screen", use XTermColor.
+--      * If TERM starts with "xterm", "screen" or "tmux", use XTermColor.
 --      * otherwise use the TerminfoBased driver.
 outputForConfig :: Config -> IO Output
 outputForConfig Config{ outputFd = Just fd, termName = Just termName
                       , colorMode = Just colorMode, .. } = do
-    t <- if "xterm" `isPrefixOf` termName || "screen" `isPrefixOf` termName
-        then XTermColor.reserveTerminal termName fd colorMode
-        -- Not an xterm-like terminal. try for generic terminfo.
-        else TerminfoBased.reserveTerminal termName fd colorMode
+    t <- if isXtermLike termName
+         then XTermColor.reserveTerminal termName fd colorMode
+         -- Not an xterm-like terminal. try for generic terminfo.
+         else TerminfoBased.reserveTerminal termName fd colorMode
 
     case mouseMode of
         Just s -> setMode t Mouse s
@@ -75,6 +75,18 @@
 
     return t
 outputForConfig config = (<> config) <$> standardIOConfig >>= outputForConfig
+
+isXtermLike :: String -> Bool
+isXtermLike termName =
+    any (`isPrefixOf` termName) xtermLikeTerminalNamePrefixes
+
+xtermLikeTerminalNamePrefixes :: [String]
+xtermLikeTerminalNamePrefixes =
+    [ "xterm"
+    , "screen"
+    , "tmux"
+    , "rxvt"
+    ]
 
 -- | Sets the cursor position to the given output column and row.
 --
diff --git a/src/Graphics/Vty/PictureToSpans.hs b/src/Graphics/Vty/PictureToSpans.hs
--- a/src/Graphics/Vty/PictureToSpans.hs
+++ b/src/Graphics/Vty/PictureToSpans.hs
@@ -83,7 +83,7 @@
     | otherwise = do
         layerOps <- mapM (`buildSpans` r) (picLayers pic)
         case layerOps of
-            []    -> fail "empty picture"
+            []    -> error "empty picture"
             [ops] -> substituteSkips (picBackground pic) ops
             -- instead of merging ops after generation the merging can
             -- be performed as part of snocOp.
@@ -113,7 +113,7 @@
     -- At this point we decide if the background character is single
     -- column or not. obviously, single column is easier.
     case safeWcwidth backgroundChar of
-        w | w == 0 -> fail $ "invalid background character " ++ show backgroundChar
+        w | w == 0 -> error $ "invalid background character " ++ show backgroundChar
           | w == 1 -> do
                 forM_ [0 .. MVector.length ops - 1] $ \row -> do
                     rowOps <- MVector.read ops row
@@ -296,7 +296,7 @@
                        -> BlitM s ()
 addMaybeClippedJoin name skip remaining offset i0Dim i0 i1 size = do
     state <- get
-    when (state^.remaining <= 0) $ fail $ name ++ " with remaining <= 0"
+    when (state^.remaining <= 0) $ error $ name ++ " with remaining <= 0"
     case state^.skip of
         s | s > size -> put $ state & skip %~ subtract size
           | s == 0    -> if state^.remaining > i0Dim
@@ -316,7 +316,7 @@
           | s >= i0Dim -> do
                 put $ state & skip %~ subtract i0Dim
                 addMaybeClipped i1
-        _ -> fail $ name ++ " has unhandled skip class"
+        _ -> error $ name ++ " has unhandled skip class"
 
 addUnclippedText :: Attr -> DisplayText -> BlitM s ()
 addUnclippedText a txt = do
@@ -344,5 +344,5 @@
         ops <- MVector.read theMrowOps row
         let ops' = Vector.snoc ops op
         when (spanOpsAffectedColumns ops' > regionWidth theRegion)
-             $ fail $ "row " ++ show row ++ " now exceeds region width"
+             $ error $ "row " ++ show row ++ " now exceeds region width"
         MVector.write theMrowOps row ops'
diff --git a/vty.cabal b/vty.cabal
--- a/vty.cabal
+++ b/vty.cabal
@@ -1,5 +1,5 @@
 name:                vty
-version:             5.36
+version:             5.37
 license:             BSD3
 license-file:        LICENSE
 author:              AUTHORS
