diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+0.2.1.1: [2018.XX.XX]
+---------------------
+* Fixed build on GHC-7.4
+* Provide `Semiring` and `Ring` for an arbitrary `Num` via `WrappedNum` newtype.
+
 0.2.1.0: [2018.09.26]
 ---------------------
 * Removed use of DefaultSignatures
diff --git a/Data/Semiring.hs b/Data/Semiring.hs
--- a/Data/Semiring.hs
+++ b/Data/Semiring.hs
@@ -35,6 +35,7 @@
     -- * Types
   , Add(..)
   , Mul(..)
+  , WrappedNum(..)
 
     -- * Ring typeclass 
   , Ring(..)
@@ -46,13 +47,13 @@
 import           Data.Bool (Bool(..), (||), (&&), otherwise, not)
 import           Data.Complex (Complex(..))
 import           Data.Eq (Eq(..))
-import           Data.Fixed (Fixed(MkFixed), HasResolution)
+import           Data.Fixed (Fixed, HasResolution)
 import           Data.Foldable (Foldable)
 import qualified Data.Foldable as Foldable
 import           Data.Function ((.), const, flip, id)
 import           Data.Functor (Functor(..))
 #if MIN_VERSION_base(4,12,0)
-import           Data.Functor.Contravariant (Predicate(..), Comparison(..), Equivalence(..), Op(..))
+import           Data.Functor.Contravariant (Predicate(..), Equivalence(..), Op(..))
 #endif
 import           Data.Functor.Identity (Identity(..))
 #if defined(VERSION_unordered_containers)
@@ -63,6 +64,7 @@
 import qualified Data.HashSet as HashSet
 #endif
 import           Data.Int (Int, Int8, Int16, Int32, Int64)
+import qualified Data.List as List
 import           Data.Maybe (Maybe(..))
 #if MIN_VERSION_base(4,12,0)
 import           Data.Monoid (Ap(..))
@@ -273,6 +275,39 @@
   {-# INLINE mempty #-}
   {-# INLINE mappend #-}
 
+-- | Provide Semiring and Ring for an arbitrary Num. It is useful with GHC 8.6+'s DerivingVia extension.
+newtype WrappedNum a = WrapNum { unwrapNum :: a }
+  deriving
+    ( Bounded
+    , Enum
+    , Eq
+    , Foldable
+    , Fractional
+    , Functor
+#if MIN_VERSION_base(4,6,1)
+    , Generic
+    , Generic1
+#endif
+    , Num.Num
+    , Ord
+    , Read
+    , Real
+    , RealFrac
+    , Show
+    , Storable
+    , Traversable
+    , Typeable
+    )
+
+instance Num.Num a => Semiring (WrappedNum a) where
+  plus  = (Num.+)
+  zero  = 0
+  times = (Num.*)
+  one   = 1
+
+instance Num.Num a => Ring (WrappedNum a) where
+  negate = Num.negate
+
 {--------------------------------------------------------------------
   Classes
 --------------------------------------------------------------------}
@@ -601,8 +636,8 @@
 deriving instance Semiring a => Semiring (Max a)
 deriving instance Semiring a => Semiring (Min a)
 instance HasResolution a => Semiring (Fixed a) where
-  zero  = MkFixed 0
-  one   = MkFixed 1
+  zero  = 0
+  one   = 1
   plus  = (Num.+)
   times = (Num.*)
   {-# INLINE zero  #-}
@@ -941,10 +976,12 @@
 listAdd (x:xs) (y:ys) = (x + y) : listAdd xs ys
 {-# NOINLINE [0] listAdd #-}
 
-listTimes [] (_:xs) = zero : listTimes [] xs
-listTimes (_:xs) [] = zero : listTimes xs []
-listTimes [] [] = []
-listTimes (x:xs) (y:ys) = (x * y) : listTimes xs ys
+listTimes _  [] = []
+listTimes xs ys = List.foldr f [] xs
+  where
+    f x zs = List.foldr (g x) id ys (zero : zs)
+    g x y a []     = x `times` y : a []
+    g x y a (z:zs) = x `times` y `plus` z : a zs
 {-# NOINLINE [0] listTimes #-}
 
 type ListBuilder a = forall b. (a -> b -> b) -> b -> b
diff --git a/semirings.cabal b/semirings.cabal
--- a/semirings.cabal
+++ b/semirings.cabal
@@ -1,6 +1,6 @@
 name:          semirings
 category:      Algebra, Data, Data Structures, Math, Maths, Mathematics
-version:       0.2.1.0
+version:       0.2.1.1
 license:       BSD3
 cabal-version: >= 1.10
 license-file:  LICENSE
