diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.4.12
+
+* Added `At` and `Ixed` instances for `Set` and `IntSet` (thanks to @wygulmage).
+
 # 0.4.11.1
 
 * No more conditional `Safe` (see [#122](https://github.com/monadfix/microlens/issues/122)).
diff --git a/microlens-ghc.cabal b/microlens-ghc.cabal
--- a/microlens-ghc.cabal
+++ b/microlens-ghc.cabal
@@ -1,5 +1,5 @@
 name:                microlens-ghc
-version:             0.4.11.1
+version:             0.4.12
 synopsis:            microlens + array, bytestring, containers, transformers
 description:
   Use this package instead of <http://hackage.haskell.org/package/microlens microlens> if you don't mind depending on all dependencies here – @Lens.Micro.GHC@ reexports everything from @Lens.Micro@ and additionally provides orphan instances of microlens classes for packages coming with GHC (<http://hackage.haskell.org/package/array array>, <http://hackage.haskell.org/package/bytestring bytestring>, <http://hackage.haskell.org/package/containers containers>, <http://hackage.haskell.org/package/transfromers transformers>).
@@ -10,7 +10,7 @@
 license:             BSD3
 license-file:        LICENSE
 author:              Edward Kmett, Artyom Kazak
-maintainer:          Monadfix <hi@monadfix.io>
+maintainer:          Monadfix <hi@monadfix.com>
 homepage:            http://github.com/monadfix/microlens
 bug-reports:         http://github.com/monadfix/microlens/issues
 category:            Data, Lenses
@@ -25,7 +25,8 @@
                      GHC==8.0.2
                      GHC==8.2.2
                      GHC==8.4.4
-                     GHC==8.6.4
+                     GHC==8.6.5
+                     GHC==8.8.1
 
 source-repository head
   type:                git
diff --git a/src/Lens/Micro/GHC.hs b/src/Lens/Micro/GHC.hs
--- a/src/Lens/Micro/GHC.hs
+++ b/src/Lens/Micro/GHC.hs
@@ -19,11 +19,11 @@
 
 By importing this module you get all functions and types from <http://hackage.haskell.org/package/microlens microlens>, as well as the following instances:
 
-* 'at' for 'Map' and 'IntMap'
+* 'at' for 'Map', 'Set', 'IntMap' and 'IntSet'
 
 * 'each' and 'ix' for
 
-    * 'Map' and 'IntMap'
+    * 'Map', 'Set', 'IntMap' and 'IntSet'
     * 'Array' and 'UArray'
     * 'Seq'
     * strict 'B.ByteString' and lazy 'BL.ByteString'
@@ -59,6 +59,10 @@
 import           Data.IntMap (IntMap)
 import qualified Data.Sequence as Seq
 import           Data.Sequence (Seq)
+import qualified Data.Set as Set
+import           Data.Set (Set)
+import qualified Data.IntSet as IntSet
+import           Data.IntSet (IntSet)
 
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as BL
@@ -87,6 +91,10 @@
 type instance IxValue (Map k a) = a
 type instance Index   (IntMap a) = Int
 type instance IxValue (IntMap a) = a
+type instance Index   (Set a) = a
+type instance IxValue (Set a) = ()
+type instance Index   IntSet = Int
+type instance IxValue IntSet = ()
 type instance Index   (Seq a) = Int
 type instance IxValue (Seq a) = a
 type instance Index   (Tree a) = [Int]
@@ -118,6 +126,18 @@
     | otherwise                  = pure m
   {-# INLINE ix #-}
 
+instance Ord k => Ixed (Set k) where
+  ix k f m = if Set.member k m
+     then f () <&> \() -> Set.insert k m
+     else pure m
+  {-# INLINE ix #-}
+
+instance Ixed IntSet where
+  ix k f m = if IntSet.member k m
+     then f () <&> \() -> IntSet.insert k m
+     else pure m
+  {-# INLINE ix #-}
+
 instance Ixed (Tree a) where
   ix xs0 f = go xs0 where
     go [] (Node a as) = f a <&> \a' -> Node a' as
@@ -154,17 +174,39 @@
   {-# INLINE ix #-}
 
 instance At (IntMap a) where
+#if MIN_VERSION_containers(0,5,8)
+  at k f = IntMap.alterF f k
+#else
   at k f m = f mv <&> \r -> case r of
     Nothing -> maybe m (const (IntMap.delete k m)) mv
     Just v' -> IntMap.insert k v' m
     where mv = IntMap.lookup k m
+#endif
   {-# INLINE at #-}
 
 instance Ord k => At (Map k a) where
+#if MIN_VERSION_containers(0,5,8)
+  at k f = Map.alterF f k
+#else
   at k f m = f mv <&> \r -> case r of
     Nothing -> maybe m (const (Map.delete k m)) mv
     Just v' -> Map.insert k v' m
     where mv = Map.lookup k m
+#endif
+  {-# INLINE at #-}
+
+instance At IntSet where
+  at k f m = f mv <&> \r -> case r of
+    Nothing -> maybe m (const (IntSet.delete k m)) mv
+    Just () -> IntSet.insert k m
+    where mv = if IntSet.member k m then Just () else Nothing
+  {-# INLINE at #-}
+
+instance Ord k => At (Set k) where
+  at k f m = f mv <&> \r -> case r of
+    Nothing -> maybe m (const (Set.delete k m)) mv
+    Just () -> Set.insert k m
+    where mv = if Set.member k m then Just () else Nothing
   {-# INLINE at #-}
 
 instance (c ~ d) => Each (Map c a) (Map d b) a b where
