diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5dd033e..85fb3e2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,10 @@ You can find our backwards-compatibility policy [here](https://github.com/hynek/
 - The lazy logger proxy returned by `structlog.get_logger()` now returns its initial values when asked for context.
   When asked for context before binding for the first time, it returned an empty dictionary in 23.3.0.
 
+- The displayed level name when using `structlog.stdlib.BoundLogger.exception()` is `"error"` instead of `"exception"`.
+  Fixes regression in 23.3.0.
+  [#584](https://github.com/hynek/structlog/issues/584)
+
 - Don't ignore the `width` argument of `RichTracebackFormatter`.
   [#587](https://github.com/hynek/structlog/issues/587)
 
diff --git a/src/structlog/_log_levels.py b/src/structlog/_log_levels.py
index bb7e67b..df1e81a 100644
--- a/src/structlog/_log_levels.py
+++ b/src/structlog/_log_levels.py
@@ -60,10 +60,15 @@ def add_log_level(
     .. versionchanged:: 20.2.0
        Importable from `structlog.processors` (additionally to
        `structlog.stdlib`).
+    .. versionchanged:: 24.1.0
+       Added mapping from "exception" to "error"
     """
     if method_name == "warn":
         # The stdlib has an alias
         method_name = "warning"
+    elif method_name == "exception":
+        # exception("") method is the same as error("", exc_info=True)
+        method_name = "error"
 
     event_dict["level"] = method_name
 

diff --git a/tests/test_stdlib.py b/tests/test_stdlib.py
index f1ae444..1c690f1 100644
--- a/tests/test_stdlib.py
+++ b/tests/test_stdlib.py
@@ -488,13 +488,16 @@ class TestAddLogLevel:
 
         assert "error" == event_dict["level"]
 
-    def test_log_level_alias_normalized(self):
+    @pytest.mark.parametrize(
+        ("alias", "normalized"), [("warn", "warning"), ("exception", "error")]
+    )
+    def test_log_level_alias_normalized(self, alias, normalized):
         """
         The normalized name of the log level is added to the event dict.
         """
-        event_dict = add_log_level(None, "warn", {})
+        event_dict = add_log_level(None, alias, {})
 
-        assert "warning" == event_dict["level"]
+        assert normalized == event_dict["level"]
 
 
 @pytest.fixture(name="make_log_record")

"exception" is a possible log level from processors.add_log_level since 23.3.0
structlog.processors.add_log_level used to report the level of "exception" events as "error", but since 23.3.0 with certain configurations it's possible to get "exception" instead:

```sh
$ pip3 install structlog==23.2.0 && python3 main.py
{'exc_info': True, 'event': 'test', '_record': <LogRecord: root, 40, 223, "{...}">, '_from_structlog': True, 'level': 'error'}

$ pip3 install structlog==23.3.0 && python3 main.py
{'exc_info': True, 'event': 'test', '_record': <LogRecord: root, 40, 217, "{...}">, '_from_structlog': True, 'level': 'exception'}
```

I wonder if this is intentional, since it's not very clearly listed in the changelog. There is "stdlib: structlog.stdlib.BoundLogger.exception()'s handling ofLogRecord.exc_info is now set consistent with logging." but I don't think this change falls into that category.

It seems to be reliant on `wrapper_class=structlog.stdlib.BoundLogger`.

Example code:
```python
import logging.config
import structlog

structlog.configure(
    processors=[
        structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
    ],
    logger_factory=structlog.stdlib.LoggerFactory(),
    wrapper_class=structlog.stdlib.BoundLogger,
)

logging_config = {
    "version": 1,
    "formatters": {
        "json": {
            "()": structlog.stdlib.ProcessorFormatter,
            "processors": [
                structlog.processors.add_log_level,
            ],
        }
    },
    "handlers": {
        "json": {
            "class": "logging.StreamHandler",
            "formatter": "json",
        },
    },
    "root": {
        "handlers": ["json"],
    },
}
logging.config.dictConfig(logging_config)
```
tests/test_stdlib.py::TestAddLogLevel::test_log_level_alias_normalized[exception-error]
tests/test_stdlib.py::TestLoggerFactory::test_deduces_correct_name tests/test_stdlib.py::TestLoggerFactory::test_ignores_frames tests/test_stdlib.py::TestLoggerFactory::test_deduces_correct_caller tests/test_stdlib.py::TestLoggerFactory::test_stack_info tests/test_stdlib.py::TestLoggerFactory::test_no_stack_info_by_default tests/test_stdlib.py::TestLoggerFactory::test_find_caller tests/test_stdlib.py::TestLoggerFactory::test_sets_correct_logger tests/test_stdlib.py::TestLoggerFactory::test_positional_argument_avoids_guessing tests/test_stdlib.py::TestFilterByLevel::test_filters_lower_levels tests/test_stdlib.py::TestFilterByLevel::test_passes_higher_levels tests/test_stdlib.py::TestBoundLogger::test_proxies_to_correct_method[debug] tests/test_stdlib.py::TestBoundLogger::test_proxies_to_correct_method[info] tests/test_stdlib.py::TestBoundLogger::test_proxies_to_correct_method[warning] tests/test_stdlib.py::TestBoundLogger::test_proxies_to_correct_method[error] tests/test_stdlib.py::TestBoundLogger::test_proxies_to_correct_method[exception] tests/test_stdlib.py::TestBoundLogger::test_proxies_to_correct_method[critical] tests/test_stdlib.py::TestBoundLogger::test_proxies_log tests/test_stdlib.py::TestBoundLogger::test_positional_args_proxied tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_attributes[name] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_attributes[level] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_attributes[parent] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_attributes[propagate] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_attributes[handlers] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_attributes[disabled] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[addHandler-method_args0] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[removeHandler-method_args1] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[hasHandlers-None] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[callHandlers-method_args3] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[handle-method_args4] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[setLevel-method_args5] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[getEffectiveLevel-None] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[isEnabledFor-method_args7] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[findCaller-None] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[makeRecord-method_args9] tests/test_stdlib.py::TestBoundLogger::test_stdlib_passthrough_methods[getChild-method_args10] tests/test_stdlib.py::TestBoundLogger::test_exception_exc_info tests/test_stdlib.py::TestBoundLogger::test_exception_exc_info_override tests/test_stdlib.py::TestBoundLogger::test_proxies_bind tests/test_stdlib.py::TestBoundLogger::test_proxies_new tests/test_stdlib.py::TestBoundLogger::test_proxies_unbind tests/test_stdlib.py::TestBoundLogger::test_proxies_try_unbind tests/test_stdlib.py::TestBoundLogger::test_async_log_methods[debug] tests/test_stdlib.py::TestBoundLogger::test_async_log_methods[info] tests/test_stdlib.py::TestBoundLogger::test_async_log_methods[warning] tests/test_stdlib.py::TestBoundLogger::test_async_log_methods[error] tests/test_stdlib.py::TestBoundLogger::test_async_log_methods[critical] tests/test_stdlib.py::TestBoundLogger::test_alog tests/test_stdlib.py::TestBoundLogger::test_aexception_exc_info_true tests/test_stdlib.py::TestBoundLogger::test_aexception_exc_info_explicit tests/test_stdlib.py::TestPositionalArgumentsFormatter::test_formats_tuple tests/test_stdlib.py::TestPositionalArgumentsFormatter::test_formats_dict tests/test_stdlib.py::TestPositionalArgumentsFormatter::test_positional_args_retained tests/test_stdlib.py::TestPositionalArgumentsFormatter::test_nop_no_args tests/test_stdlib.py::TestPositionalArgumentsFormatter::test_args_removed_if_empty tests/test_stdlib.py::TestAddLogLevelNumber::test_log_level_number_added[critical-50] tests/test_stdlib.py::TestAddLogLevelNumber::test_log_level_number_added[exception-40] tests/test_stdlib.py::TestAddLogLevelNumber::test_log_level_number_added[error-40] tests/test_stdlib.py::TestAddLogLevelNumber::test_log_level_number_added[warn-30] tests/test_stdlib.py::TestAddLogLevelNumber::test_log_level_number_added[warning-30] tests/test_stdlib.py::TestAddLogLevelNumber::test_log_level_number_added[info-20] tests/test_stdlib.py::TestAddLogLevelNumber::test_log_level_number_added[debug-10] tests/test_stdlib.py::TestAddLogLevelNumber::test_log_level_number_added[notset-0] tests/test_stdlib.py::TestAddLogLevel::test_log_level_added tests/test_stdlib.py::TestAddLogLevel::test_log_level_alias_normalized[warn-warning] tests/test_stdlib.py::TestAddLoggerName::test_logger_name_added tests/test_stdlib.py::TestAddLoggerName::test_logger_name_added_with_record tests/test_stdlib.py::TestExtraAdder::test_add_extra[None-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra[allow1-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra[allow2-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra[allow3-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra[allow4-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra[allow5-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra[allow6-misses6] tests/test_stdlib.py::TestExtraAdder::test_add_extra[allow7-misses7] tests/test_stdlib.py::TestExtraAdder::test_add_extra[allow8-None] tests/test_stdlib.py::TestExtraAdder::test_no_record tests/test_stdlib.py::TestExtraAdder::test_add_extra_e2e[None-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra_e2e[allow1-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra_e2e[allow2-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra_e2e[allow3-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra_e2e[allow4-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra_e2e[allow5-None] tests/test_stdlib.py::TestExtraAdder::test_add_extra_e2e[allow6-misses6] tests/test_stdlib.py::TestExtraAdder::test_add_extra_e2e[allow7-misses7] tests/test_stdlib.py::TestExtraAdder::test_add_extra_e2e[allow8-None] tests/test_stdlib.py::TestRenderToLogKW::test_default tests/test_stdlib.py::TestRenderToLogKW::test_add_extra_event_dict tests/test_stdlib.py::TestRenderToLogKW::test_handles_special_kw tests/test_stdlib.py::TestProcessorFormatter::test_foreign_delegate tests/test_stdlib.py::TestProcessorFormatter::test_clears_args tests/test_stdlib.py::TestProcessorFormatter::test_pass_foreign_args_true_sets_positional_args_key tests/test_stdlib.py::TestProcessorFormatter::test_log_dict tests/test_stdlib.py::TestProcessorFormatter::test_foreign_pre_chain tests/test_stdlib.py::TestProcessorFormatter::test_foreign_pre_chain_add_logger_name tests/test_stdlib.py::TestProcessorFormatter::test_foreign_chain_can_pass_dictionaries_without_excepting tests/test_stdlib.py::TestProcessorFormatter::test_foreign_pre_chain_gets_exc_info tests/test_stdlib.py::TestProcessorFormatter::test_foreign_pre_chain_sys_exc_info tests/test_stdlib.py::TestProcessorFormatter::test_other_handlers_get_original_record tests/test_stdlib.py::TestProcessorFormatter::test_formatter_unsets_exc_info[True] tests/test_stdlib.py::TestProcessorFormatter::test_formatter_unsets_exc_info[False] tests/test_stdlib.py::TestProcessorFormatter::test_formatter_unsets_stack_info[True] tests/test_stdlib.py::TestProcessorFormatter::test_formatter_unsets_stack_info[False] tests/test_stdlib.py::TestProcessorFormatter::test_native tests/test_stdlib.py::TestProcessorFormatter::test_native_logger tests/test_stdlib.py::TestProcessorFormatter::test_foreign_pre_chain_filter_by_level tests/test_stdlib.py::TestProcessorFormatter::test_processor_and_processors tests/test_stdlib.py::TestProcessorFormatter::test_no_renderer tests/test_stdlib.py::TestProcessorFormatter::test_remove_processors_meta tests/test_stdlib.py::TestProcessorFormatter::test_non_string_message_warning tests/test_stdlib.py::TestProcessorFormatter::test_logrecord_exc_info tests/test_stdlib.py::TestProcessorFormatter::test_use_get_message_false tests/test_stdlib.py::TestAsyncBoundLogger::test_sync_bl tests/test_stdlib.py::TestAsyncBoundLogger::test_protocol tests/test_stdlib.py::TestAsyncBoundLogger::test_correct_levels[critical] tests/test_stdlib.py::TestAsyncBoundLogger::test_correct_levels[exception] tests/test_stdlib.py::TestAsyncBoundLogger::test_correct_levels[error] tests/test_stdlib.py::TestAsyncBoundLogger::test_correct_levels[warn] tests/test_stdlib.py::TestAsyncBoundLogger::test_correct_levels[warning] tests/test_stdlib.py::TestAsyncBoundLogger::test_correct_levels[info] tests/test_stdlib.py::TestAsyncBoundLogger::test_correct_levels[debug] tests/test_stdlib.py::TestAsyncBoundLogger::test_log_method tests/test_stdlib.py::TestAsyncBoundLogger::test_exception tests/test_stdlib.py::TestAsyncBoundLogger::test_exception_do_not_overwrite tests/test_stdlib.py::TestAsyncBoundLogger::test_bind_unbind tests/test_stdlib.py::TestAsyncBoundLogger::test_integration tests/test_stdlib.py::test_recreate_defaults[None] tests/test_stdlib.py::test_recreate_defaults[45]