diff --git a/optuna/multi_objective/study.py b/optuna/multi_objective/study.py
index db1f70402..0d9755d25 100644
--- a/optuna/multi_objective/study.py
+++ b/optuna/multi_objective/study.py
@@ -16,6 +16,7 @@ from optuna import multi_objective
 from optuna.storages import BaseStorage
 from optuna.study import Study
 from optuna.study import StudyDirection
+from optuna.trial import FrozenTrial
 from optuna.trial import Trial
 from optuna.trial import TrialState
 
@@ -233,15 +234,17 @@ class MultiObjectiveStudy(object):
             mo_trial._report_complete_values(values)
             return 0.0  # Dummy value.
 
-        mo_callbacks = None
-        if callbacks is not None:
-            mo_callbacks = [
-                lambda study, trial: callback(
-                    MultiObjectiveStudy(study),
-                    multi_objective.trial.FrozenMultiObjectiveTrial(self.n_objectives, trial),
-                )
-                for callback in callbacks
-            ]
+        # Wraps a multi-objective callback so that we can pass it to the `Study.optimize` method.
+        def wrap_mo_callback(callback: CallbackFuncType) -> Callable[[Study, FrozenTrial], None]:
+            return lambda study, trial: callback(
+                MultiObjectiveStudy(study),
+                multi_objective.trial.FrozenMultiObjectiveTrial(self.n_objectives, trial),
+            )
+
+        if callbacks is None:
+            wrapped_callbacks = None
+        else:
+            wrapped_callbacks = [wrap_mo_callback(callback) for callback in callbacks]
 
         self._study.optimize(
             mo_objective,
@@ -249,7 +252,7 @@ class MultiObjectiveStudy(object):
             n_trials=n_trials,
             n_jobs=n_jobs,
             catch=catch,
-            callbacks=mo_callbacks,
+            callbacks=wrapped_callbacks,
             gc_after_trial=gc_after_trial,
             show_progress_bar=show_progress_bar,
         )

Bug when passing multiple callbacks to `MultiObjectiveStudy.optimize`
<!-- Please write a clear and concise description of what the bug is. -->

When passing multiple callbacks to `MultiObjectiveStudy.optimize`, it uses only the last callback.

```python
import optuna


n_objectives = 2
directions = ["minimize" for _ in range(n_objectives)]
study = optuna.multi_objective.create_study(directions)


def objective(trial):
    return [trial.suggest_uniform("v{}".format(i), 0, 5) for i in range(n_objectives)]


callbacks = [
    lambda a, b: print("first callback"),
    lambda a, b: print("second callback"),
]

study.optimize(objective, n_trials=10, callbacks=callbacks)
```

This code outputs:

```
[I 2020-05-06 12:56:02,205] Finished trial#0 with values: [0.030503339013888686, 0.457606610954287] with parameters: {'v0': 0.030503339013888686, 'v1': 0.457606610954287}.
second callback
second callback
[I 2020-05-06 12:56:02,243] Finished trial#1 with values: [3.7186248349736672, 1.8148814699741478] with parameters: {'v0': 3.7186248349736672, 'v1': 1.8148814699741478}.
second callback
second callback
[I 2020-05-06 12:56:02,283] Finished trial#2 with values: [4.386752523520264, 1.180154220379264] with parameters: {'v0': 4.386752523520264, 'v1': 1.180154220379264}.
second callback
second callback
...
```

Colab notebook that reproduces this bug:
https://colab.research.google.com/drive/1YeT8ItU9IO65wXsqY9k-_ATCrCBW0BRZ?usp=sharing


## Expected behavior

The output is expected to be:

```
[I 2020-05-06 12:56:02,205] Finished trial#0 with values: [0.030503339013888686, 0.457606610954287] with parameters: {'v0': 0.030503339013888686, 'v1': 0.457606610954287}.
first callback
second callback
[I 2020-05-06 12:56:02,243] Finished trial#1 with values: [3.7186248349736672, 1.8148814699741478] with parameters: {'v0': 3.7186248349736672, 'v1': 1.8148814699741478}.
first callback
second callback
[I 2020-05-06 12:56:02,283] Finished trial#2 with values: [4.386752523520264, 1.180154220379264] with parameters: {'v0': 4.386752523520264, 'v1': 1.180154220379264}.
first callback
second callback
...
```
## Environment

- Optuna version: master branch
- Python version: 3.6.9
- OS: linux
- (Optional) Other libraries and their versions:

## Error messages, stack traces, or logs

```
# error messages, stack traces, or logs
```

## Steps to reproduce

1.
2.
3.

## Reproducible examples (optional)


## Additional context (optional)

<!-- Please add any other context or screenshots about the problem here. -->

I found this bug on https://lgtm.com/projects/g/optuna/optuna/?mode=list
diff --git a/tests/multi_objective/test_study.py b/tests/multi_objective/test_study.py
index cc0aa1a60..ab8c83c60 100644
--- a/tests/multi_objective/test_study.py
+++ b/tests/multi_objective/test_study.py
@@ -120,3 +120,23 @@ def test_enqueue_trial() -> None:
         return [0, 0]
 
     study.optimize(objective, n_trials=2)
+
+
+def test_callbacks() -> None:
+    study = optuna.multi_objective.create_study(["minimize", "maximize"])
+
+    def objective(trial: optuna.multi_objective.trial.MultiObjectiveTrial) -> List[float]:
+        x = trial.suggest_float("x", 0, 10)
+        y = trial.suggest_float("y", 0, 10)
+        return x, y
+
+    list0 = []
+    list1 = []
+    callbacks = [
+        lambda study, trial: list0.append(trial.number),
+        lambda study, trial: list1.append(trial.number),
+    ]
+    study.optimize(objective, n_trials=2, callbacks=callbacks)
+
+    assert list0 == [0, 1]
+    assert list1 == [0, 1]

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio
apt-get update apt-get install -y openmpi-bin libopenmpi-dev
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alembic==1.12.1
attrs==24.2.0
autopage==0.5.2
certifi @ file:///croot/certifi_1671487769961/work/certifi
cliff==3.10.1
cmaes==0.11.1
cmd2==2.4.3
colorlog==6.9.0
coverage==7.2.7
exceptiongroup==1.2.2
execnet==2.0.2
greenlet==3.1.1
importlib-metadata==6.7.0
importlib-resources==5.12.0
iniconfig==2.0.0
joblib==1.3.2
Mako==1.2.4
MarkupSafe==2.1.5
numpy==1.21.6
-e git+https://github.com/optuna/optuna.git@dbdba521a55dd71d7b4f158fc125a01859cdb843#egg=optuna
packaging==24.0
pbr==6.1.1
pluggy==1.2.0
prettytable==3.7.0
pyparsing==3.1.4
pyperclip==1.9.0
pytest==7.4.4
pytest-asyncio==0.21.2
pytest-cov==4.1.0
pytest-mock==3.11.1
pytest-xdist==3.5.0
PyYAML==6.0.1
scipy==1.7.3
SQLAlchemy==2.0.40
stevedore==3.5.2
tomli==2.0.1
tqdm==4.67.1
typing_extensions==4.7.1
wcwidth==0.2.13
zipp==3.15.0

name: optuna
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alembic==1.12.1
      - attrs==24.2.0
      - autopage==0.5.2
      - cliff==3.10.1
      - cmaes==0.11.1
      - cmd2==2.4.3
      - colorlog==6.9.0
      - coverage==7.2.7
      - exceptiongroup==1.2.2
      - execnet==2.0.2
      - greenlet==3.1.1
      - importlib-metadata==6.7.0
      - importlib-resources==5.12.0
      - iniconfig==2.0.0
      - joblib==1.3.2
      - mako==1.2.4
      - markupsafe==2.1.5
      - numpy==1.21.6
      - packaging==24.0
      - pbr==6.1.1
      - pluggy==1.2.0
      - prettytable==3.7.0
      - pyparsing==3.1.4
      - pyperclip==1.9.0
      - pytest==7.4.4
      - pytest-asyncio==0.21.2
      - pytest-cov==4.1.0
      - pytest-mock==3.11.1
      - pytest-xdist==3.5.0
      - pyyaml==6.0.1
      - scipy==1.7.3
      - sqlalchemy==2.0.40
      - stevedore==3.5.2
      - tomli==2.0.1
      - tqdm==4.67.1
      - typing-extensions==4.7.1
      - wcwidth==0.2.13
      - zipp==3.15.0
prefix: /opt/conda/envs/optuna

tests/multi_objective/test_study.py::test_callbacks
tests/multi_objective/test_study.py::test_load_study
tests/multi_objective/test_study.py::test_create_study tests/multi_objective/test_study.py::test_optimize[1] tests/multi_objective/test_study.py::test_optimize[2] tests/multi_objective/test_study.py::test_optimize[3] tests/multi_objective/test_study.py::test_pareto_front tests/multi_objective/test_study.py::test_study_user_attrs tests/multi_objective/test_study.py::test_study_system_attrs tests/multi_objective/test_study.py::test_enqueue_trial
optuna/multi_objective/study.py
optuna/multi_objective/study.py