diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,11 @@
 API-ish changes in the hledger-lib package. See also hledger.
 
 
+# 1.5.1 (2018/3/22)
+
+* support GHC 8.4 (add missing Semigroup instance for Journal)
+
+
 # 1.5 (2017/12/31)
 
 * -V/--value uses today's market prices by default, not those of last transaction date. #683, #648)
diff --git a/Hledger/Data/Journal.hs b/Hledger/Data/Journal.hs
--- a/Hledger/Data/Journal.hs
+++ b/Hledger/Data/Journal.hs
@@ -1,5 +1,7 @@
 {-# LANGUAGE Rank2Types #-}
 {-# LANGUAGE StandaloneDeriving, OverloadedStrings #-}
+{-# LANGUAGE CPP #-}
+
 {-|
 
 A 'Journal' is a set of transactions, plus optional related data.  This is
@@ -84,6 +86,7 @@
 import Data.Maybe
 import Data.Monoid
 import Data.Ord
+import qualified Data.Semigroup as Sem
 import Data.Text (Text)
 import qualified Data.Text as T
 import Safe (headMay, headDef)
@@ -159,9 +162,8 @@
 -- CHILD <> PARENT. A parsed journal's data is in reverse order, so
 -- this gives what we want.
 --
-instance Monoid Journal where
-  mempty = nulljournal
-  mappend j1 j2 = Journal {
+instance Sem.Semigroup Journal where
+  j1 <> j2 = Journal {
      jparsedefaultyear          = jparsedefaultyear          j2
     ,jparsedefaultcommodity     = jparsedefaultcommodity     j2
     ,jparseparentaccounts       = jparseparentaccounts       j2
@@ -179,6 +181,13 @@
     ,jfiles                     = jfiles                     j1 <> jfiles                     j2
     ,jlastreadtime              = max (jlastreadtime j1) (jlastreadtime j2)
     }
+
+instance Monoid Journal where
+  mempty = nulljournal
+#if !(MIN_VERSION_base(4,11,0))
+  -- This is redundant starting with base-4.11 / GHC 8.4.
+  mappend = (Sem.<>)
+#endif
 
 nulljournal :: Journal
 nulljournal = Journal {
diff --git a/hledger-lib.cabal b/hledger-lib.cabal
--- a/hledger-lib.cabal
+++ b/hledger-lib.cabal
@@ -1,11 +1,11 @@
--- This file has been generated from package.yaml by hpack version 0.20.0.
+-- This file has been generated from package.yaml by hpack version 0.21.2.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: c0497f13da483640b446c596007d9e15f8235a01f8b2ae8ffa96f89dbf59ffb7
+-- hash: 65b38111258a2bd9065067e58c4d087cfca39eb38e7bb02c035d9265a9dd59fc
 
 name:           hledger-lib
-version:        1.5
+version:        1.5.1
 synopsis:       Core data types, parsers and functionality for the hledger accounting tools
 description:    This is a reusable library containing hledger's core functionality.
                 .
@@ -50,42 +50,6 @@
   location: https://github.com/simonmichael/hledger
 
 library
-  hs-source-dirs:
-      ./.
-  ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing -fno-warn-missing-signatures -fno-warn-type-defaults -fno-warn-orphans
-  build-depends:
-      Decimal
-    , HUnit
-    , ansi-terminal >=0.6.2.3
-    , array
-    , base >=4.8 && <5
-    , base-compat >=0.8.1
-    , blaze-markup >=0.5.1
-    , bytestring
-    , cmdargs >=0.10
-    , containers
-    , csv
-    , data-default >=0.5
-    , deepseq
-    , directory
-    , extra
-    , filepath
-    , hashtables >=1.2
-    , megaparsec >=5.0
-    , mtl
-    , mtl-compat
-    , old-time
-    , parsec >=3
-    , pretty-show >=1.6.4
-    , regex-tdfa
-    , safe >=0.2
-    , semigroups
-    , split >=0.1
-    , text >=1.2
-    , time >=1.5
-    , transformers >=0.2
-    , uglymemo
-    , utf8-string >=0.3.5
   exposed-modules:
       Hledger
       Hledger.Data
@@ -133,18 +97,11 @@
       Text.Megaparsec.Compat
   other-modules:
       Paths_hledger_lib
-  default-language: Haskell2010
-
-test-suite doctests
-  type: exitcode-stdio-1.0
-  main-is: doctests.hs
   hs-source-dirs:
       ./.
-      tests
   ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing -fno-warn-missing-signatures -fno-warn-type-defaults -fno-warn-orphans
   build-depends:
       Decimal
-    , Glob >=0.7
     , HUnit
     , ansi-terminal >=0.6.2.3
     , array
@@ -158,7 +115,6 @@
     , data-default >=0.5
     , deepseq
     , directory
-    , doctest >=0.8
     , extra
     , filepath
     , hashtables >=1.2
@@ -170,13 +126,20 @@
     , pretty-show >=1.6.4
     , regex-tdfa
     , safe >=0.2
-    , semigroups
     , split >=0.1
     , text >=1.2
     , time >=1.5
     , transformers >=0.2
     , uglymemo
     , utf8-string >=0.3.5
+  if (!impl(ghc >= 8.0))
+    build-depends:
+        semigroups ==0.18.*
+  default-language: Haskell2010
+
+test-suite doctests
+  type: exitcode-stdio-1.0
+  main-is: doctests.hs
   other-modules:
       Hledger
       Hledger.Data
@@ -223,17 +186,13 @@
       Hledger.Utils.UTF8IOCompat
       Text.Megaparsec.Compat
       Paths_hledger_lib
-  default-language: Haskell2010
-
-test-suite hunittests
-  type: exitcode-stdio-1.0
-  main-is: hunittests.hs
   hs-source-dirs:
       ./.
       tests
   ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing -fno-warn-missing-signatures -fno-warn-type-defaults -fno-warn-orphans
   build-depends:
       Decimal
+    , Glob >=0.7
     , HUnit
     , ansi-terminal >=0.6.2.3
     , array
@@ -247,10 +206,10 @@
     , data-default >=0.5
     , deepseq
     , directory
+    , doctest >=0.8
     , extra
     , filepath
     , hashtables >=1.2
-    , hledger-lib
     , megaparsec >=5.0
     , mtl
     , mtl-compat
@@ -259,15 +218,20 @@
     , pretty-show >=1.6.4
     , regex-tdfa
     , safe >=0.2
-    , semigroups
     , split >=0.1
-    , test-framework
-    , test-framework-hunit
     , text >=1.2
     , time >=1.5
     , transformers >=0.2
     , uglymemo
     , utf8-string >=0.3.5
+  if (!impl(ghc >= 8.0))
+    build-depends:
+        semigroups ==0.18.*
+  default-language: Haskell2010
+
+test-suite hunittests
+  type: exitcode-stdio-1.0
+  main-is: hunittests.hs
   other-modules:
       Hledger
       Hledger.Data
@@ -314,4 +278,46 @@
       Hledger.Utils.UTF8IOCompat
       Text.Megaparsec.Compat
       Paths_hledger_lib
+  hs-source-dirs:
+      ./.
+      tests
+  ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing -fno-warn-missing-signatures -fno-warn-type-defaults -fno-warn-orphans
+  build-depends:
+      Decimal
+    , HUnit
+    , ansi-terminal >=0.6.2.3
+    , array
+    , base >=4.8 && <5
+    , base-compat >=0.8.1
+    , blaze-markup >=0.5.1
+    , bytestring
+    , cmdargs >=0.10
+    , containers
+    , csv
+    , data-default >=0.5
+    , deepseq
+    , directory
+    , extra
+    , filepath
+    , hashtables >=1.2
+    , hledger-lib
+    , megaparsec >=5.0
+    , mtl
+    , mtl-compat
+    , old-time
+    , parsec >=3
+    , pretty-show >=1.6.4
+    , regex-tdfa
+    , safe >=0.2
+    , split >=0.1
+    , test-framework
+    , test-framework-hunit
+    , text >=1.2
+    , time >=1.5
+    , transformers >=0.2
+    , uglymemo
+    , utf8-string >=0.3.5
+  if (!impl(ghc >= 8.0))
+    build-depends:
+        semigroups ==0.18.*
   default-language: Haskell2010
