diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,20 @@
 Brick changelog
 ---------------
 
+0.17
+----
+
+Package changes:
+* Updated to depend on Vty 5.15.
+* Updated to remove dependency on data-default.
+* Discontinued support for GHC versions prior to 7.10.1.
+
+API changes:
+* Removed Data.Default instances for AttrName, AttrMap, Result, and
+  BorderStyle (use Monoid instances instead where possible).
+* Added defaultBorderStyle :: BorderStyle.
+* Added emptyResult :: Result n.
+
 0.16
 ----
 
@@ -16,7 +30,7 @@
   element (thanks @diegospd)
 
 Performance improvements:
-* hBox and vBox now use more efficient DList data structure when
+* hBox and vBox now use the more efficient DList data structure when
   rendering to improve performance for boxes with many elements (thanks
   Mitsutoshi Aoe)
 
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.16
+version:             0.17
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
@@ -79,9 +79,8 @@
     Brick.Widgets.Internal
 
   build-depends:       base <= 5,
-                       vty >= 5.12,
+                       vty >= 5.15,
                        transformers,
-                       data-default,
                        dlist,
                        containers,
                        microlens >= 0.3.0.0,
@@ -105,7 +104,7 @@
   main-is:             CacheDemo.hs
   build-depends:       base,
                        brick,
-                       vty >= 5.12,
+                       vty >= 5.15,
                        text,
                        microlens >= 0.3.0.0,
                        microlens-th
@@ -119,8 +118,7 @@
   main-is:             VisibilityDemo.hs
   build-depends:       base,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens >= 0.3.0.0,
                        microlens-th
@@ -135,8 +133,7 @@
   main-is:             ViewportScrollDemo.hs
   build-depends:       base,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens
 
@@ -149,8 +146,7 @@
   main-is:             DialogDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens
 
@@ -163,8 +159,7 @@
   main-is:             MouseDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens >= 0.3.0.0,
                        microlens-th,
@@ -179,8 +174,7 @@
   main-is:             LayerDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens >= 0.3.0.0,
                        microlens-th
@@ -194,8 +188,7 @@
   main-is:             SuspendAndResumeDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens >= 0.3.0.0,
                        microlens-th
@@ -209,8 +202,7 @@
   main-is:             PaddingDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens
 
@@ -223,8 +215,7 @@
   main-is:             AttrDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens
 
@@ -237,8 +228,7 @@
   main-is:             MarkupDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens
 
@@ -251,8 +241,7 @@
   main-is:             ListDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens >= 0.3.0.0,
                        vector
@@ -266,8 +255,7 @@
   main-is:             CustomEventDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens >= 0.3.0.0,
                        microlens-th
@@ -281,8 +269,7 @@
   main-is:             HelloWorldDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens
 
@@ -295,8 +282,7 @@
   main-is:             EditDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        vector,
                        microlens >= 0.3.0.0,
@@ -312,8 +298,7 @@
   main-is:             BorderDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens
 
@@ -327,7 +312,6 @@
   main-is:             ProgressBarDemo.hs
   build-depends:       base <= 5,
                        brick,
-                       vty >= 5.12,
-                       data-default,
+                       vty >= 5.15,
                        text,
                        microlens
diff --git a/docs/guide.rst b/docs/guide.rst
--- a/docs/guide.rst
+++ b/docs/guide.rst
@@ -343,7 +343,9 @@
    main :: IO ()
    main = do
        eventChan <- Brick.BChan.newBChan 10
-       finalState <- customMain (Graphics.Vty.mkVty Data.Default.def) (Just eventChan) app initialState
+       finalState <- customMain
+                       (Graphics.Vty.mkVty Data.Default.defaultConfig)
+                       (Just eventChan) app initialState
        -- Use finalState and exit
 
 The ``customMain`` function lets us have control over how the ``vty``
diff --git a/programs/CustomEventDemo.hs b/programs/CustomEventDemo.hs
--- a/programs/CustomEventDemo.hs
+++ b/programs/CustomEventDemo.hs
@@ -6,7 +6,6 @@
 import Lens.Micro.TH (makeLenses)
 import Control.Monad (void, forever)
 import Control.Concurrent (threadDelay, forkIO)
-import Data.Default
 import Data.Monoid
 import qualified Graphics.Vty as V
 
@@ -18,6 +17,9 @@
   , continue
   , halt
   )
+import Brick.AttrMap
+  ( attrMap
+  )
 import Brick.Types
   ( Widget
   , Next
@@ -66,7 +68,7 @@
         , appChooseCursor = showFirstCursor
         , appHandleEvent = appEvent
         , appStartEvent = return
-        , appAttrMap = def
+        , appAttrMap = const $ attrMap V.defAttr []
         }
 
 main :: IO ()
@@ -77,4 +79,4 @@
         writeBChan chan Counter
         threadDelay 1000000
 
-    void $ customMain (V.mkVty def) (Just chan) theApp initialState
+    void $ customMain (V.mkVty V.defaultConfig) (Just chan) theApp initialState
diff --git a/programs/LayerDemo.hs b/programs/LayerDemo.hs
--- a/programs/LayerDemo.hs
+++ b/programs/LayerDemo.hs
@@ -5,7 +5,6 @@
 import Lens.Micro ((^.), (&), (%~))
 import Lens.Micro.TH (makeLenses)
 import Control.Monad (void)
-import Data.Default
 import qualified Graphics.Vty as V
 
 import qualified Brick.Types as T
@@ -17,6 +16,9 @@
   ( translateBy
   , str
   )
+import Brick.AttrMap
+  ( attrMap
+  )
 
 data St =
     St { _topLayerLocation :: T.Location
@@ -70,7 +72,7 @@
     M.App { M.appDraw = drawUi
           , M.appStartEvent = return
           , M.appHandleEvent = appEvent
-          , M.appAttrMap = const def
+          , M.appAttrMap = const $ attrMap V.defAttr []
           , M.appChooseCursor = M.neverShowCursor
           }
 
diff --git a/programs/PaddingDemo.hs b/programs/PaddingDemo.hs
--- a/programs/PaddingDemo.hs
+++ b/programs/PaddingDemo.hs
@@ -1,8 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
 module Main where
 
-import Data.Default
-
 import Brick.Main (App(..), neverShowCursor, resizeOrQuit, defaultMain)
 import Brick.Types
   ( Widget
@@ -22,6 +20,8 @@
   )
 import Brick.Widgets.Border as B
 import Brick.Widgets.Center as C
+import Brick.AttrMap (attrMap)
+import qualified Graphics.Vty as V
 
 ui :: Widget ()
 ui =
@@ -50,7 +50,7 @@
     App { appDraw = const [ui]
         , appHandleEvent = resizeOrQuit
         , appStartEvent = return
-        , appAttrMap = const def
+        , appAttrMap = const $ attrMap V.defAttr []
         , appChooseCursor = neverShowCursor
         }
 
diff --git a/programs/SuspendAndResumeDemo.hs b/programs/SuspendAndResumeDemo.hs
--- a/programs/SuspendAndResumeDemo.hs
+++ b/programs/SuspendAndResumeDemo.hs
@@ -6,13 +6,15 @@
 import Lens.Micro.TH (makeLenses)
 import Control.Monad (void)
 import Data.Monoid
-import Data.Default
 import qualified Graphics.Vty as V
 
 import Brick.Main
   ( App(..), neverShowCursor, defaultMain
   , suspendAndResume, halt, continue
   )
+import Brick.AttrMap
+  ( attrMap
+  )
 import Brick.Types
   ( Widget
   , EventM
@@ -59,7 +61,7 @@
         , appChooseCursor = neverShowCursor
         , appHandleEvent = appEvent
         , appStartEvent = return
-        , appAttrMap = const def
+        , appAttrMap = const $ attrMap V.defAttr []
         }
 
 main :: IO ()
diff --git a/programs/ViewportScrollDemo.hs b/programs/ViewportScrollDemo.hs
--- a/programs/ViewportScrollDemo.hs
+++ b/programs/ViewportScrollDemo.hs
@@ -7,7 +7,6 @@
 
 import Control.Monad (void)
 import Data.Monoid ((<>))
-import Data.Default
 import qualified Graphics.Vty as V
 
 import qualified Brick.Types as T
@@ -18,6 +17,9 @@
   ( Widget
   , ViewportType(Horizontal, Vertical, Both)
   )
+import Brick.AttrMap
+  ( attrMap
+  )
 import Brick.Widgets.Core
   ( hLimit
   , vLimit
@@ -75,7 +77,7 @@
     M.App { M.appDraw = drawUi
           , M.appStartEvent = return
           , M.appHandleEvent = appEvent
-          , M.appAttrMap = const def
+          , M.appAttrMap = const $ attrMap V.defAttr []
           , M.appChooseCursor = M.neverShowCursor
           }
 
diff --git a/src/Brick/AttrMap.hs b/src/Brick/AttrMap.hs
--- a/src/Brick/AttrMap.hs
+++ b/src/Brick/AttrMap.hs
@@ -49,7 +49,6 @@
 import Data.Maybe (catMaybes)
 import Data.List (inits)
 import Data.String (IsString(..))
-import Data.Default (Default(..))
 
 import Graphics.Vty (Attr(..), MaybeDefault(..))
 
@@ -68,9 +67,6 @@
 data AttrName = AttrName [String]
               deriving (Show, Eq, Ord)
 
-instance Default AttrName where
-    def = mempty
-
 instance Monoid AttrName where
     mempty = AttrName []
     mappend (AttrName as) (AttrName bs) = AttrName $ as `mappend` bs
@@ -82,9 +78,6 @@
 data AttrMap = AttrMap Attr (M.Map AttrName Attr)
              | ForceAttr Attr
              deriving Show
-
-instance Default AttrMap where
-    def = AttrMap def mempty
 
 -- | Create an attribute name from a string.
 attrName :: String -> AttrName
diff --git a/src/Brick/Main.hs b/src/Brick/Main.hs
--- a/src/Brick/Main.hs
+++ b/src/Brick/Main.hs
@@ -51,7 +51,6 @@
 import Control.Applicative ((<$>))
 import Data.Monoid (mempty)
 #endif
-import Data.Default
 import Data.Maybe (listToMaybe)
 import qualified Data.Map as M
 import qualified Data.Set as S
@@ -66,7 +65,9 @@
   , shutdown
   , nextEvent
   , mkVty
+  , defaultConfig
   )
+import Graphics.Vty.Attributes (defAttr)
 
 import Brick.BChan (BChan, newBChan, readBChan, readBChan2, writeBChan)
 import Brick.Types (Widget, EventM(..))
@@ -119,7 +120,7 @@
             -- ^ The initial application state.
             -> IO s
 defaultMain app st = do
-    customMain (mkVty def) Nothing app st
+    customMain (mkVty defaultConfig) Nothing app st
 
 -- | A simple main entry point which takes a widget and renders it. This
 -- event loop terminates when the user presses any key, but terminal
@@ -132,7 +133,7 @@
     let app = App { appDraw = const [w]
                   , appHandleEvent = resizeOrQuit
                   , appStartEvent = return
-                  , appAttrMap = def
+                  , appAttrMap = const $ attrMap defAttr []
                   , appChooseCursor = neverShowCursor
                   }
     in defaultMain app ()
diff --git a/src/Brick/Markup.hs b/src/Brick/Markup.hs
--- a/src/Brick/Markup.hs
+++ b/src/Brick/Markup.hs
@@ -15,7 +15,6 @@
 import Control.Monad (forM)
 import qualified Data.Text as T
 import Data.Text.Markup
-import Data.Default (def)
 
 import Graphics.Vty (Attr, vertCat, horizCat, string)
 
@@ -54,4 +53,4 @@
                   return $ string a $ T.unpack t
               return $ horizCat is
       lineImgs <- mapM mkLine markupLines
-      return $ def & imageL .~ vertCat lineImgs
+      return $ emptyResult & imageL .~ vertCat lineImgs
diff --git a/src/Brick/Types.hs b/src/Brick/Types.hs
--- a/src/Brick/Types.hs
+++ b/src/Brick/Types.hs
@@ -43,6 +43,7 @@
 
   -- ** Rendering results
   , Result(..)
+  , emptyResult
   , lookupAttrName
   , Extent(..)
 
diff --git a/src/Brick/Types/Internal.hs b/src/Brick/Types/Internal.hs
--- a/src/Brick/Types/Internal.hs
+++ b/src/Brick/Types/Internal.hs
@@ -38,6 +38,7 @@
   , cursorsL
   , extentsL
   , visibilityRequestsL
+  , emptyResult
   )
 where
 
@@ -51,7 +52,6 @@
 import qualified Data.Set as S
 import qualified Data.Map as M
 import Graphics.Vty (Vty, Event, Button, Modifier, DisplayRegion, Image, emptyImage)
-import Data.Default (Default(..))
 
 import Brick.Types.TH
 import Brick.AttrMap (AttrName, AttrMap)
@@ -194,8 +194,8 @@
 
 suffixLenses ''Result
 
-instance Default (Result n) where
-    def = Result emptyImage [] [] []
+emptyResult :: Result n
+emptyResult = Result emptyImage [] [] []
 
 -- | The type of events.
 data BrickEvent n e = VtyEvent Event
diff --git a/src/Brick/Widgets/Border/Style.hs b/src/Brick/Widgets/Border/Style.hs
--- a/src/Brick/Widgets/Border/Style.hs
+++ b/src/Brick/Widgets/Border/Style.hs
@@ -17,11 +17,10 @@
   , unicode
   , unicodeBold
   , unicodeRounded
+  , defaultBorderStyle
   )
 where
 
-import Data.Default
-
 -- | A border style for use in any widget that needs to render borders
 -- in a consistent style.
 data BorderStyle =
@@ -50,8 +49,8 @@
                 }
                 deriving (Show, Read, Eq)
 
-instance Default BorderStyle where
-    def = unicode
+defaultBorderStyle :: BorderStyle
+defaultBorderStyle = unicode
 
 -- | Make a border style using the specified character everywhere.
 borderStyleFromChar :: Char -> BorderStyle
diff --git a/src/Brick/Widgets/Core.hs b/src/Brick/Widgets/Core.hs
--- a/src/Brick/Widgets/Core.hs
+++ b/src/Brick/Widgets/Core.hs
@@ -92,7 +92,6 @@
 import Control.Monad.Trans.Class (lift)
 import qualified Data.Foldable as F
 import qualified Data.Text as T
-import Data.Default
 import qualified Data.DList as DL
 import qualified Data.Map as M
 import qualified Data.Set as S
@@ -207,13 +206,13 @@
           fixEmpty l = l
           dropUnused l = takeColumns (availWidth c) <$> take (availHeight c) l
       case force theLines of
-          [] -> return def
-          [one] -> return $ def & imageL .~ (V.string (c^.attrL) one)
+          [] -> return emptyResult
+          [one] -> return $ emptyResult & imageL .~ (V.string (c^.attrL) one)
           multiple ->
               let maxLength = maximum $ V.safeWcswidth <$> multiple
                   lineImgs = lineImg <$> multiple
                   lineImg lStr = V.string (c^.attrL) (lStr ++ replicate (maxLength - V.safeWcswidth lStr) ' ')
-              in return $ def & imageL .~ (V.vertCat lineImgs)
+              in return $ emptyResult & imageL .~ (V.vertCat lineImgs)
 
 -- | Build a widget from a one-line 'T.Text' value. Behaves the same as
 -- 'str'.
@@ -308,7 +307,7 @@
 fill ch =
     Widget Greedy Greedy $ do
       c <- getContext
-      return $ def & imageL .~ (V.charFill (c^.attrL) ch (c^.availWidthL) (c^.availHeightL))
+      return $ emptyResult & imageL .~ (V.charFill (c^.attrL) ch (c^.availWidthL) (c^.availHeightL))
 
 -- | Vertical box layout: put the specified widgets one above the other
 -- in the specified order (uppermost first). Defers growth policies to
@@ -550,7 +549,7 @@
 
 -- | Build a widget directly from a raw Vty image.
 raw :: V.Image -> Widget n
-raw img = Widget Fixed Fixed $ return $ def & imageL .~ img
+raw img = Widget Fixed Fixed $ return $ emptyResult & imageL .~ img
 
 -- | Translate the specified widget by the specified offset amount.
 -- Defers to the translated widget for growth policy.
diff --git a/src/Brick/Widgets/Internal.hs b/src/Brick/Widgets/Internal.hs
--- a/src/Brick/Widgets/Internal.hs
+++ b/src/Brick/Widgets/Internal.hs
@@ -13,13 +13,13 @@
 import Lens.Micro ((^.), (&), (%~))
 import Control.Monad.Trans.State.Lazy
 import Control.Monad.Trans.Reader
-import Data.Default
 import Data.Maybe (catMaybes)
 import qualified Graphics.Vty as V
 
 import Brick.Types
 import Brick.Types.Internal
 import Brick.AttrMap
+import Brick.Widgets.Border.Style
 
 renderFinal :: AttrMap
             -> [Widget n]
@@ -32,7 +32,7 @@
         (layerResults, !newRS) = flip runState rs $ sequence $
             (\p -> runReaderT p ctx) <$>
             (render <$> cropToContext <$> layerRenders)
-        ctx = Context def (fst sz) (snd sz) def aMap
+        ctx = Context mempty (fst sz) (snd sz) defaultBorderStyle aMap
         pic = V.picForLayers $ uncurry V.resize sz <$> (^.imageL) <$> layerResults
         -- picWithBg is a workaround for runaway attributes.
         -- See https://github.com/coreyoconnor/vty/issues/95
diff --git a/src/Data/Text/Markup.hs b/src/Data/Text/Markup.hs
--- a/src/Data/Text/Markup.hs
+++ b/src/Data/Text/Markup.hs
@@ -21,7 +21,6 @@
 import Data.Monoid
 #endif
 
-import Data.Default (Default, def)
 import Data.String (IsString(..))
 import qualified Data.Text as T
 
@@ -34,7 +33,7 @@
     mappend (Markup t1) (Markup t2) =
         Markup (t1 `mappend` t2)
 
-instance (Default a) => IsString (Markup a) where
+instance (Monoid a) => IsString (Markup a) where
     fromString = fromText . T.pack
 
 -- | Build a piece of markup; assign the specified metadata to every
@@ -43,8 +42,8 @@
 t @@ val = Markup [(c, val) | c <- T.unpack t]
 
 -- | Build markup from text with the default metadata.
-fromText :: (Default a) => T.Text -> Markup a
-fromText = (@@ def)
+fromText :: (Monoid a) => T.Text -> Markup a
+fromText = (@@ mempty)
 
 -- | Extract the text from markup, discarding the markup metadata.
 toText :: (Eq a) => Markup a -> T.Text
