v1.4.0
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f123062..740ae65 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@
 
 ## [Unreleased]
 
+## [1.4.0] - 2026-03-04
+
 ### Added since 1.3.0
 
 * Allow avifenc to read png or jpeg files through stdin using --stdin-format.
@@ -28,6 +30,7 @@
 * Add --grid option to avifgainmaputil.
 * Apply clean aperture crop, rotation and mirror when decoding to PNG or JPEG.
   Remove orientation information from Exif if present.
+* Add avif::RGBImageCleanup to the C++ API.
 
 ### Changed since 1.3.0
 
@@ -63,13 +66,16 @@
 * Converting an image containing a gain map using avifenc with the --grid flag
   now also splits the gain map into a grid.
 * In avifenc, set Exif orientation to 1 (no transformation) when converting
-  JPEGs to Avif.
+  JPEGs to AVIF.
+* Use all-intra encoding for a layered image if the total number of layers is 2
+  and the quality of the first layer is very low (q <= 10).
 
 ### Removed since 1.3.0
 
 * Remove ext/avm.cmd.
 * Remove the AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM CMake flag.
 * Remove support for libaom versions up to 2.0.0 inclusive.
+* Un-export the private function avifImagePushProperty().
 
 ## [1.3.0] - 2025-05-09
 
@@ -1333,7 +1339,8 @@
 - Constants `AVIF_VERSION`, `AVIF_VERSION_MAJOR`, `AVIF_VERSION_MINOR`, `AVIF_VERSION_PATCH`
 - `avifVersion()` function
 
-[Unreleased]: https://github.com/AOMediaCodec/libavif/compare/v1.3.0...HEAD
+[Unreleased]: https://github.com/AOMediaCodec/libavif/compare/v1.4.0...HEAD
+[1.4.0]: https://github.com/AOMediaCodec/libavif/compare/v1.3.0...v1.4.0
 [1.3.0]: https://github.com/AOMediaCodec/libavif/compare/v1.2.1...v1.3.0
 [1.2.1]: https://github.com/AOMediaCodec/libavif/compare/v1.2.0...v1.2.1
 [1.2.0]: https://github.com/AOMediaCodec/libavif/compare/v1.1.1...v1.2.0
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cd88a64..ceff4a7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -31,7 +31,7 @@
     cmake_policy(SET CMP0194 NEW)
 endif()
 
-project(libavif LANGUAGES C VERSION 1.3.0)
+project(libavif LANGUAGES C VERSION 1.4.0)
 
 # The root directory of the avif source
 set(AVIF_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
@@ -67,7 +67,7 @@
 #   If the source code was changed, but there were no interface changes:
 #     Increment PATCH.
 set(LIBRARY_VERSION_MAJOR 16)
-set(LIBRARY_VERSION_MINOR 3)
+set(LIBRARY_VERSION_MINOR 4)
 set(LIBRARY_VERSION_PATCH 0)
 set(LIBRARY_VERSION "${LIBRARY_VERSION_MAJOR}.${LIBRARY_VERSION_MINOR}.${LIBRARY_VERSION_PATCH}")
 set(LIBRARY_SOVERSION ${LIBRARY_VERSION_MAJOR})
diff --git a/include/avif/avif.h b/include/avif/avif.h
index 1c09903..3d9038d 100644
--- a/include/avif/avif.h
+++ b/include/avif/avif.h
@@ -78,9 +78,9 @@
 // downstream projects to do greater-than preprocessor checks on AVIF_VERSION
 // to leverage in-development code without breaking their stable builds.
 #define AVIF_VERSION_MAJOR 1
-#define AVIF_VERSION_MINOR 3
+#define AVIF_VERSION_MINOR 4
 #define AVIF_VERSION_PATCH 0
-#define AVIF_VERSION_DEVEL 1
+#define AVIF_VERSION_DEVEL 0
 #define AVIF_VERSION \
     ((AVIF_VERSION_MAJOR * 1000000) + (AVIF_VERSION_MINOR * 10000) + (AVIF_VERSION_PATCH * 100) + AVIF_VERSION_DEVEL)