diff --git a/manifest.dhall b/manifest.dhall
index adfca00c57ba061f7a07c3099255e807aa75e869..cba7ed444b318d244e977a5c2f295dba66e362c5 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -464,6 +464,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "mod" "0.1.2.2"
     , callHackage "monad-control" "1.0.3.1"
     , callHackage "monad-logger" "0.3.37"
+    , callHackage "monad-loops" "0.4.3"
     , callHackage "monad-time" "0.4.0.0"
     , callHackage "monad-par-extras" "0.3.3"
     , callHackage "monad-par" "0.3.5"
diff --git a/overlay.nix b/overlay.nix
index d031d802335c4f94286ff053476a9cf251f06d88..09d5f23e42706a2704fb8ffec7b1e18a1933b9cc 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -675,6 +675,8 @@ self: with pkgs.haskell.lib; {
 
   monad-logger = self.callPackage (./pkgs/monad-logger.nix) { };
 
+  monad-loops = self.callPackage (./pkgs/monad-loops.nix) { };
+
   monad-par = self.callPackage (./pkgs/monad-par.nix) { };
 
   monad-par-extras = self.callPackage (./pkgs/monad-par-extras.nix) { };
diff --git a/pkgs/monad-loops.nix b/pkgs/monad-loops.nix
new file mode 100644
index 0000000000000000000000000000000000000000..d78e5f85f3af7d07e998edc9c01039f72a0e8deb
--- /dev/null
+++ b/pkgs/monad-loops.nix
@@ -0,0 +1,22 @@
+{ mkDerivation, base, lib, tasty, tasty-hunit }:
+mkDerivation {
+  pname = "monad-loops";
+  version = "0.4.3";
+  sha256 = "7eaaaf6bc43661e9e86e310ff8c56fbea16eb6bf13c31a2e28103138ac164c18";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base ];
+  testHaskellDepends = [ base tasty tasty-hunit ];
+  enableLibraryProfiling = false;
+  enableExecutableProfiling = false;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/mokus0/monad-loops";
+  description = "Monadic loops";
+  license = lib.licenses.publicDomain;
+  broken = false;
+}