diff --git a/Changelog.md b/Changelog.md
index 637f33365..7074c1e70 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [Unreleased]
 
+* Use module name specified by `[package.metadata.maturin]` in [#1409](https://github.com/PyO3/maturin/pull/1409)
+
 ## [0.14.9] - 2023-01-10
 
 * Don't pass `MACOSX_DEPLOYMENT_TARGET` when query default value from rustc in [#1395](https://github.com/PyO3/maturin/pull/1395)
diff --git a/src/build_options.rs b/src/build_options.rs
index a08085b10..03c32f20d 100644
--- a/src/build_options.rs
+++ b/src/build_options.rs
@@ -501,8 +501,9 @@ impl BuildOptions {
 
         if !bridge.is_bin() && module_name.contains('-') {
             bail!(
-                "The module name must not contains a minus \
-                 (Make sure you have set an appropriate [lib] name in your Cargo.toml)"
+                "The module name must not contain a minus `-` \
+                 (Make sure you have set an appropriate [lib] name or \
+                 [package.metadata.maturin] name in your Cargo.toml)"
             );
         }
 
diff --git a/src/project_layout.rs b/src/project_layout.rs
index 4478a098d..fc2b5786a 100644
--- a/src/project_layout.rs
+++ b/src/project_layout.rs
@@ -128,12 +128,7 @@ impl ProjectResolver {
             .unwrap_or(crate_name)
             .to_owned();
 
-        // Only use extension name from extra metadata if it contains dot
-        let extension_name = extra_metadata
-            .name
-            .as_ref()
-            .filter(|name| name.contains('.'))
-            .unwrap_or(&module_name);
+        let extension_name = extra_metadata.name.as_ref().unwrap_or(&module_name);
 
         let project_root = if pyproject_file.is_file() {
             pyproject_file.parent().unwrap_or(manifest_dir)