diff --git a/CHANGELOG.md b/CHANGELOG.md
index 41c61976..d0ce9a2b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,25 @@ Changes for the upcoming release can be found in [changelog.d](https://github.co
+
+## 4.4.0 (2023-09-07)
+
+### New features
+
+- Add a `safir.click.display_help` helper function that implements a `help` command for Click-based command-line interfaces, with support for nested subcommands.
+- Add a new `safir.asyncio.AsyncMultiQueue` data structure, which is an asyncio multi-reader queue that delivers all messages to each reader independently.
+- Add `read_` methods for the Kubernetes object types for which the mock provided `create_` methods (`NetworkPolicy` and `PersistentVolumeClaim`).
+
+### Bug fixes
+
+- Fix typing of the `safir.asyncio.run_with_asyncio` decorator so that it doesn't mask the type of the underlying function.
+- Kubernetes objects included in events are now serialized properly using the Kubernetes camel-case field names instead of the Python snake-case names. In addition to matching Kubernetes behavior more closely, this allows a watch configured with the Kubernetes model type to deserialize the object in the `object` key of the event dictionary. The type must be passed explicitly to the `Watch` constructor, since kubernetes_asyncio's type autodetection does not work with Safir's mock.
+- `safir.testing.kubernetes.patch_kubernetes` no longer mocks the entire `ApiClient` class since it is required for deserialization of objects in Kubernetes events. It instead mocks the `request` method of that class for safety, to prevent any network requests to Kubernetes clusters when Kubernetes is mocked.
+
+### Other changes
+
+- Safir now uses the [Ruff](https://beta.ruff.rs/docs/) linter instead of flake8 and isort.
+
## 4.3.1 (2023-07-17)
diff --git a/changelog.d/20230830_155927_rra_DM_40567.md b/changelog.d/20230830_155927_rra_DM_40567.md
deleted file mode 100644
index 0783dcdc..00000000
--- a/changelog.d/20230830_155927_rra_DM_40567.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### New features
-
-- Add a `safir.click.display_help` helper function that implements a `help` command for Click-based command-line interfaces, with support for nested subcommands.
diff --git a/changelog.d/20230905_084310_rra_DM_40628.md b/changelog.d/20230905_084310_rra_DM_40628.md
deleted file mode 100644
index 806c2a10..00000000
--- a/changelog.d/20230905_084310_rra_DM_40628.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Other changes
-
-- Safir now uses the [Ruff](https://beta.ruff.rs/docs/) linter instead of flake8 and isort.
diff --git a/changelog.d/20230905_090034_rra_DM_40638.md b/changelog.d/20230905_090034_rra_DM_40638.md
deleted file mode 100644
index 22d5b627..00000000
--- a/changelog.d/20230905_090034_rra_DM_40638.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### New features
-
-- Add new `safir.asyncio.AsyncMultiQueue` data structure, which is an asyncio multi-reader queue that delivers all messages to each reader independently.
diff --git a/changelog.d/20230905_090226_rra_DM_40638a.md b/changelog.d/20230905_090226_rra_DM_40638a.md
deleted file mode 100644
index 5f36229d..00000000
--- a/changelog.d/20230905_090226_rra_DM_40638a.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Bug fixes
-
-- Fix typing of the `safir.asyncio.run_with_asyncio` decorator so that it doesn't mask the type of the underlying function.
diff --git a/changelog.d/20230907_110606_rra_DM_40638b.md b/changelog.d/20230907_110606_rra_DM_40638b.md
deleted file mode 100644
index c547e30f..00000000
--- a/changelog.d/20230907_110606_rra_DM_40638b.md
+++ /dev/null
@@ -1,4 +0,0 @@
-### Bug fixes
-
-- Kubernetes objects included in events are now serialized properly using the Kubernetes camel-case field names instead of the Python snake-case names. In addition to matching Kubernetes behavior more closely, this allows a watch configured with the Kubernetes model type to deserialize the object in the `object` key of the event dictionary. The type must be passed explicitly to the `Watch` constructor, since kubernetes_asyncio's type autodetection does not work with Safir's mock.
-- `safir.testing.kubernetes.patch_kubernetes` no longer mocks the entire `ApiClient` class since it is required for deserialization of objects in Kubernetes events. It instead mocks the `request` method of that class for safety, to prevent any network requests to Kubernetes clusters when Kubernetes is mocked.
diff --git a/changelog.d/20230907_135241_rra_DM_40638b.md b/changelog.d/20230907_135241_rra_DM_40638b.md
deleted file mode 100644
index c18fb365..00000000
--- a/changelog.d/20230907_135241_rra_DM_40638b.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### New features
-
-- Add `read_` methods for the Kubernetes object types for which the mock provided `create_` methods (`NetworkPolicy` and `PersistentVolumeClaim`).