diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for interval-patterns
 
+## 0.2.0.0 - 2022-05-30
+
+* generalize `Layers` to arbitrary `Num` types and `Calendar` to arbitrary `Real` types
+
 ## 0.1.0.0 - 2022-05-19
 
 * constructors behave more intuitively
diff --git a/interval-patterns.cabal b/interval-patterns.cabal
--- a/interval-patterns.cabal
+++ b/interval-patterns.cabal
@@ -1,13 +1,13 @@
 cabal-version: 3.0
 name: interval-patterns
-version: 0.1.0.0
+version: 0.2.0.0
 author: Melanie Brown
 description: A library for easy manipulation of intervals according to their overlap.
 maintainer: brown.m@pm.me
 license: BSD-3-Clause
 license-file: LICENSE
-homepage: https://github.com/cigsender/interval-patterns
-bug-reports: https://github.com/cigsender/interval-patterns/issues
+homepage: https://github.com/mixphix/interval-patterns
+bug-reports: https://github.com/mixphix/interval-patterns/issues
 extra-source-files: CHANGELOG.md
 copyright: 2022 Melanie Brown
 
diff --git a/src/Data/Timeframe.hs b/src/Data/Timeframe.hs
--- a/src/Data/Timeframe.hs
+++ b/src/Data/Timeframe.hs
@@ -41,37 +41,37 @@
 
 -- | An 'Event' is something that happens for a period of time.
 --
--- > type Event = Layers UTCTime
-type Event = Layers UTCTime (Sum Int)
+-- > type Event n = Layers UTCTime (Sum n)
+type Event n = Layers UTCTime (Sum n)
 
-event :: Timeframe -> Event
+event :: (Num n) => Timeframe -> Event n
 event = (`Layers.singleton` 1)
 
-newtype Calendar ev = Calendar {getCalendar :: Map ev Event}
+newtype Calendar ev n = Calendar {getCalendar :: Map ev (Event n)}
   deriving (Eq, Ord, Show, Typeable)
 
-instance (Ord ev) => Semigroup (Calendar ev) where
+instance (Ord ev, Num n) => Semigroup (Calendar ev n) where
   Calendar a <> Calendar b = Calendar (Map.unionWith (<>) a b)
 
-instance (Ord ev) => Monoid (Calendar ev) where
+instance (Ord ev, Num n) => Monoid (Calendar ev n) where
   mempty = Calendar mempty
 
-singleton :: (Ord ev) => ev -> Event -> Calendar ev
+singleton :: (Ord ev, Num n) => ev -> Event n -> Calendar ev n
 singleton ev cvg = Calendar (Map.singleton ev cvg)
 
-calendar :: (Ord ev) => ev -> Timeframe -> Calendar ev
+calendar :: (Ord ev, Num n) => ev -> Timeframe -> Calendar ev n
 calendar ev tf = singleton ev (Layers.singleton tf 1)
 
-addEvent :: (Ord ev) => ev -> Event -> Calendar ev -> Calendar ev
+addEvent :: (Ord ev, Num n) => ev -> Event n -> Calendar ev n -> Calendar ev n
 addEvent ev cvg (Calendar c) = Calendar (Map.insertWith (<>) ev cvg c)
 
-totalDuration :: (Ord ev) => ev -> Calendar ev -> Maybe NominalDiffTime
+totalDuration :: forall ev n. (Ord ev, Real n) => ev -> Calendar ev n -> Maybe NominalDiffTime
 totalDuration ev (Calendar c) = case c Map.!? ev of
   Nothing -> Just 0
   Just is -> foldr f (Just 0) (Layers.toList is)
  where
-  f :: (Timeframe, Sum Int) -> Maybe NominalDiffTime -> Maybe NominalDiffTime
+  f :: (Timeframe, Sum n) -> Maybe NominalDiffTime -> Maybe NominalDiffTime
   f _ Nothing = Nothing
-  f (tf, Sum n) (Just x) = case (fromIntegral n *) <$> duration tf of
+  f (tf, Sum n) (Just x) = case (realToFrac n *) <$> duration tf of
     Nothing -> Nothing
     Just y -> Just (x + y)
