diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,33 @@
 
+5.34
+----
+
+API changes:
+ * Added an `NFData` instance for `Event` (thanks Mario Lang)
+ * Removed `Monoid` and `Semigroup` instances for `Attr` and
+   `MaybeDefault`. This change removed the instances because they were
+   misbehaved; merging `Attr` and `MaybeDefault` values with these
+   instances resulted in field value losses. For example, before this
+   change,
+```
+(defAttr `withForeColor` blue) <> (defAttr `withBackColor` green)
+```
+   would result in just
+```
+   (defAttr `withBackColor` green)
+```
+   because the instances were designed to favor the right-hand
+   arguments' fields even if they had not been explicitly set
+   (a consequence of the `MaybeDefault` `Semigroup` instance).
+   While that behavior was sensible specifically in the context of
+   `Graphics.Vty.Inline`, it wasn't a useful user-facing API and it made
+   for surprising instance behavior. Since there is actually no good way
+   to handle this in a `Semigroup` instance for `Attr` -- some choices
+   have to be made about how to merge two attributes' foreground colors,
+   and that won't be much better than what we had -- the instance was
+   just removed.
+
+
 5.33
 ----
 
diff --git a/src/Graphics/Vty/Attributes.hs b/src/Graphics/Vty/Attributes.hs
--- a/src/Graphics/Vty/Attributes.hs
+++ b/src/Graphics/Vty/Attributes.hs
@@ -61,9 +61,6 @@
 
 import Control.DeepSeq
 import Data.Bits
-#if !(MIN_VERSION_base(4,11,0))
-import Data.Semigroup
-#endif
 import Data.Text (Text)
 import Data.Word
 import GHC.Generics
@@ -116,19 +113,6 @@
 --  Then the foreground color encoded into 8 bits.
 --  Then the background color encoded into 8 bits.
 
-instance Semigroup Attr where
-    attr0 <> attr1 =
-        Attr ( attrStyle attr0     <> attrStyle attr1 )
-             ( attrForeColor attr0 <> attrForeColor attr1 )
-             ( attrBackColor attr0 <> attrBackColor attr1 )
-             ( attrURL attr0       <> attrURL attr1 )
-
-instance Monoid Attr where
-    mempty = Attr mempty mempty mempty mempty
-#if !(MIN_VERSION_base(4,11,0))
-    mappend = (<>)
-#endif
-
 -- | Specifies the display attributes such that the final style and
 -- color values do not depend on the previously applied display
 -- attribute. The display attributes can still depend on the terminal's
@@ -150,23 +134,6 @@
     rnf Default = ()
     rnf KeepCurrent = ()
     rnf (SetTo v) = rnf v
-
-instance Eq v => Semigroup (MaybeDefault v) where
-    Default     <> Default     = Default
-    Default     <> KeepCurrent = Default
-    Default     <> SetTo v     = SetTo v
-    KeepCurrent <> Default     = Default
-    KeepCurrent <> KeepCurrent = KeepCurrent
-    KeepCurrent <> SetTo v     = SetTo v
-    SetTo _v    <> Default     = Default
-    SetTo v     <> KeepCurrent = SetTo v
-    SetTo _     <> SetTo v     = SetTo v
-
-instance Eq v => Monoid ( MaybeDefault v ) where
-    mempty = KeepCurrent
-#if !(MIN_VERSION_base(4,11,0))
-    mappend = (<>)
-#endif
 
 -- | Styles are represented as an 8 bit word. Each bit in the word is 1
 -- if the style attribute assigned to that bit should be applied and 0
diff --git a/src/Graphics/Vty/Inline.hs b/src/Graphics/Vty/Inline.hs
--- a/src/Graphics/Vty/Inline.hs
+++ b/src/Graphics/Vty/Inline.hs
@@ -56,13 +56,13 @@
 -- | Set the background color to the provided 'Color'.
 backColor :: Color -> InlineM ()
 backColor c = modify $ \s ->
-    s { inlineAttr = inlineAttr s `mappend` (currentAttr `withBackColor` c)
+    s { inlineAttr = inlineAttr s `withBackColor` c
       }
 
 -- | Set the foreground color to the provided 'Color'.
 foreColor :: Color -> InlineM ()
 foreColor c = modify $ \s ->
-    s { inlineAttr = inlineAttr s `mappend` (currentAttr `withForeColor` c)
+    s { inlineAttr = inlineAttr s `withForeColor` c
       }
 
 -- | Attempt to change the 'Style' of the following text..
@@ -71,7 +71,7 @@
 -- produced. The style can still be removed.
 applyStyle :: Style -> InlineM ()
 applyStyle st = modify $ \s ->
-    s { inlineAttr = inlineAttr s `mappend` (currentAttr `withStyle` st)
+    s { inlineAttr = inlineAttr s `withStyle` st
       }
 
 -- | Attempt to remove the specified 'Style' from the display of the
diff --git a/src/Graphics/Vty/Input/Events.hs b/src/Graphics/Vty/Input/Events.hs
--- a/src/Graphics/Vty/Input/Events.hs
+++ b/src/Graphics/Vty/Input/Events.hs
@@ -1,6 +1,7 @@
 {-# Language DeriveGeneric #-}
 module Graphics.Vty.Input.Events where
 
+import Control.DeepSeq
 import Data.ByteString
 import GHC.Generics
 
@@ -21,16 +22,22 @@
          | KHome | KPageUp | KDel | KEnd | KPageDown | KBegin | KMenu
     deriving (Eq,Show,Read,Ord,Generic)
 
+instance NFData Key
+
 -- | Modifier keys. Key codes are interpreted such that users are more
 -- likely to have Meta than Alt; for instance on the PC Linux console,
 -- 'MMeta' will generally correspond to the physical Alt key.
 data Modifier = MShift | MCtrl | MMeta | MAlt
     deriving (Eq,Show,Read,Ord,Generic)
 
+instance NFData Modifier
+
 -- | Mouse buttons.
 data Button = BLeft | BMiddle | BRight | BScrollUp | BScrollDown
     deriving (Eq,Show,Read,Ord,Generic)
 
+instance NFData Button
+
 -- | Events.
 data Event
     = EvKey Key [Modifier]
@@ -61,5 +68,7 @@
     | EvGainedFocus
     -- ^ The terminal running the application gained input focus.
     deriving (Eq,Show,Read,Ord,Generic)
+
+instance NFData Event
 
 type ClassifyMap = [(String,Event)]
diff --git a/src/Graphics/Vty/Picture.hs b/src/Graphics/Vty/Picture.hs
--- a/src/Graphics/Vty/Picture.hs
+++ b/src/Graphics/Vty/Picture.hs
@@ -79,9 +79,6 @@
 data Cursor =
     -- | Hide the cursor
     NoCursor
-    -- | Show the cursor at the given logical column accounting for
-    -- character width in the presence of multi-column characters.
-    | PositionOnly !Bool !Int !Int
     -- | Set the terminal's cursor position without displaying a cursor
     -- character. This is important for accessibility with screen
     -- readers where a cursor position needs to be reported but we may
@@ -89,6 +86,9 @@
     -- reasons. The boolean argument indicates whether the positioning
     -- should be absolute as with 'AbsoluteCursor' ('True') or logical
     -- as with 'Cursor' ('False').
+    | PositionOnly !Bool !Int !Int
+    -- | Show the cursor at the given logical column accounting for
+    -- character width in the presence of multi-column characters.
     | Cursor !Int !Int
     -- | Show the cursor at the given absolute terminal column and row
     | AbsoluteCursor !Int !Int
diff --git a/vty.cabal b/vty.cabal
--- a/vty.cabal
+++ b/vty.cabal
@@ -1,5 +1,5 @@
 name:                vty
-version:             5.33
+version:             5.34
 license:             BSD3
 license-file:        LICENSE
 author:              AUTHORS
@@ -543,7 +543,7 @@
   build-depends:       vty,
                        Cabal >= 1.20,
                        QuickCheck >= 2.7,
-                       random >= 1.0 && < 1.2,
+                       random >= 1.0 && < 1.3,
                        base >= 4.8 && < 5,
                        bytestring,
                        containers,
@@ -553,7 +553,6 @@
                        unix,
                        utf8-string >= 0.3 && < 1.1,
                        vector >= 0.7
-
 
 test-suite verify-utf8-width
   default-language:    Haskell2010
