diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,12 @@
 # Changelog for Calamity
 
+## 0.1.12.0
+
+*2020-06-06*
+
+* Changed some events to take enums instead of booleans: `GuildCreateEvt` and
+  `GuildDeleteEvt`.
+
 ## 0.1.11.2
 
 *2020-06-03*
diff --git a/calamity.cabal b/calamity.cabal
--- a/calamity.cabal
+++ b/calamity.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: ba16c0e978455ebd1dd04a85ba656738289d036e6dfe9e45b55d5843d6511fab
+-- hash: dc8569a5fcc9d4c838ce504e002cc38a1016ff3089378cbf8437b12f4f6c4e60
 
 name:           calamity
-version:        0.1.11.2
+version:        0.1.12.0
 synopsis:       A library for writing discord bots
 description:    Please see the README on GitHub at <https://github.com/nitros12/calamity#readme>
 category:       Network, Web
diff --git a/src/Calamity/Client/Client.hs b/src/Calamity/Client/Client.hs
--- a/src/Calamity/Client/Client.hs
+++ b/src/Calamity/Client/Client.hs
@@ -409,10 +409,11 @@
 --   pure $ map (\f -> f chan lastPinTimestamp) (getEventHandlers @"channelpinsupdate" eh)
 
 handleEvent' eh evt@(GuildCreate guild) = do
-  isNew <- isUnavailableGuild (getID guild)
+  isNew <- not <$> isUnavailableGuild (getID guild)
   updateCache evt
   Just guild <- getGuild (getID guild)
-  pure $ map (\f -> f guild isNew) (getEventHandlers @'GuildCreateEvt eh)
+  pure $ map (\f -> f guild (if isNew then GuildCreateNew else GuildCreateAvailable))
+    (getEventHandlers @'GuildCreateEvt eh)
 
 handleEvent' eh evt@(GuildUpdate guild) = do
   Just oldGuild <- getGuild (getID guild)
@@ -424,7 +425,8 @@
 handleEvent' eh evt@(GuildDelete UnavailableGuild { id, unavailable }) = do
   Just oldGuild <- getGuild id
   updateCache evt
-  pure $ map (\f -> f oldGuild unavailable) (getEventHandlers @'GuildDeleteEvt eh)
+  pure $ map (\f -> f oldGuild (if unavailable then GuildDeleteUnavailable else GuildDeleteRemoved))
+    (getEventHandlers @'GuildDeleteEvt eh)
 
 handleEvent' eh evt@(GuildBanAdd BanData { guildID, user }) = do
   Just guild <- getGuild guildID
@@ -549,12 +551,11 @@
   case guildID of
     Just gid -> do
       Just guild <- getGuild gid
-      Just member <- pure $ guild ^. #members . at (coerceSnowflake userID)
       Just chan <- pure $ GuildChannel' <$> guild ^. #channels . at (coerceSnowflake channelID)
-      pure $ map (\f -> f chan (Just member) timestamp) (getEventHandlers @'TypingStartEvt eh)
+      pure $ map (\f -> f chan userID timestamp) (getEventHandlers @'TypingStartEvt eh)
     Nothing -> do
       Just chan <- DMChannel' <<$>> getDM (coerceSnowflake channelID)
-      pure $ map (\f -> f chan Nothing timestamp) (getEventHandlers @'TypingStartEvt eh)
+      pure $ map (\f -> f chan userID timestamp) (getEventHandlers @'TypingStartEvt eh)
 
 handleEvent' eh evt@(UserUpdate _) = do
   Just oldUser <- getBotUser
@@ -598,8 +599,10 @@
 updateCache (GuildUpdate guild) =
   updateGuild (getID guild) (update guild)
 
-updateCache (GuildDelete guild) =
-  delGuild (getID guild)
+updateCache (GuildDelete UnavailableGuild { id, unavailable }) =
+  if unavailable
+  then setUnavailableGuild id
+  else delGuild id
 
 updateCache (GuildEmojisUpdate GuildEmojisUpdateData { guildID, emojis }) =
   updateGuild guildID (#emojis .~ SM.fromList emojis)
diff --git a/src/Calamity/Client/Types.hs b/src/Calamity/Client/Types.hs
--- a/src/Calamity/Client/Types.hs
+++ b/src/Calamity/Client/Types.hs
@@ -3,6 +3,8 @@
     ( Client(..)
     , StartupError(..)
     , EventType(..)
+    , GuildCreateStatus(..)
+    , GuildDeleteStatus(..)
     , EHType
     , BotC
     , SetupEff
@@ -27,6 +29,7 @@
 import           Calamity.Types.Model.User
 import           Calamity.Types.Token
 import           Calamity.Types.UnixTimestamp
+import           Calamity.Types.Snowflake
 
 import           Control.Concurrent.Async
 import           Control.Concurrent.Chan.Unagi
@@ -52,6 +55,9 @@
 import qualified Polysemy.AtomicState            as P
 import qualified Polysemy.Reader                 as P
 
+import qualified TextShow.Generic                as TSG
+import TextShow
+
 data Client = Client
   { shards              :: TVar [(InChan ControlMessage, Async (Maybe ()))]
   , numShards           :: MVar Int
@@ -149,6 +155,18 @@
   | forall s a. CustomEvt s a
   -- ^ A custom event, @s@ is the name and @a@ is the data sent to the handler
 
+data GuildCreateStatus
+  = GuildCreateNew -- ^ The guild was just joined
+  | GuildCreateAvailable -- ^ The guild is becoming available
+  deriving ( Generic, Show )
+  deriving ( TextShow ) via TSG.FromGeneric GuildCreateStatus
+
+data GuildDeleteStatus
+  = GuildDeleteUnavailable -- ^ The guild became unavailable
+  | GuildDeleteRemoved -- ^ The bot was removed from the guild
+  deriving ( Generic, Show )
+  deriving ( TextShow ) via TSG.FromGeneric GuildDeleteStatus
+
 -- | A type family to decide what the parameters for an event handler should be
 -- determined by the type of event it is handling.
 type family EHType (d :: EventType) m r where
@@ -157,9 +175,9 @@
   EHType 'ChannelUpdateEvt            m r = Channel   -> Channel                        -> m r
   EHType 'ChannelDeleteEvt            m r = Channel                                     -> m r
   EHType 'ChannelpinsUpdateEvt        m r = Channel   -> Maybe UTCTime                  -> m r
-  EHType 'GuildCreateEvt              m r = Guild     -> Bool                           -> m r
+  EHType 'GuildCreateEvt              m r = Guild     -> GuildCreateStatus              -> m r
   EHType 'GuildUpdateEvt              m r = Guild     -> Guild                          -> m r
-  EHType 'GuildDeleteEvt              m r = Guild     -> Bool                           -> m r
+  EHType 'GuildDeleteEvt              m r = Guild     -> GuildDeleteStatus              -> m r
   EHType 'GuildBanAddEvt              m r = Guild     -> User                           -> m r
   EHType 'GuildBanRemoveEvt           m r = Guild     -> User                           -> m r
   EHType 'GuildEmojisUpdateEvt        m r = Guild     -> [Emoji]                        -> m r
@@ -180,7 +198,7 @@
   EHType 'MessageReactionAddEvt       m r = Message   -> Reaction                       -> m r
   EHType 'MessageReactionRemoveEvt    m r = Message   -> Reaction                       -> m r
   EHType 'MessageReactionRemoveAllEvt m r = Message                                     -> m r
-  EHType 'TypingStartEvt              m r = Channel   -> Maybe Member  -> UnixTimestamp -> m r
+  EHType 'TypingStartEvt              m r = Channel  -> Snowflake User -> UnixTimestamp -> m r
   EHType 'UserUpdateEvt               m r = User      -> User                           -> m r
   EHType ('CustomEvt s a)             m r = a                                           -> m r
 
