diff --git a/djmoney/models/fields.py b/djmoney/models/fields.py
index 8b812be..e24af66 100644
--- a/djmoney/models/fields.py
+++ b/djmoney/models/fields.py
@@ -35,7 +35,7 @@ def get_value(obj, expr):
     else:
         expr = expr.value
     if isinstance(expr, OldMoney):
-        expr.__class__ = Money
+        expr = Money(expr.amount, expr.currency)
     return expr
 
 
@@ -206,7 +206,7 @@ class MoneyField(models.DecimalField):
         elif isinstance(default, (float, Decimal, int)):
             default = Money(default, default_currency)
         elif isinstance(default, OldMoney):
-            default.__class__ = Money
+            default = Money(default.amount, default.currency)
         if default is not None and default is not NOT_PROVIDED and not isinstance(default, Money):
             raise ValueError("default value must be an instance of Money, is: %s" % default)
         return default
diff --git a/docs/changes.rst b/docs/changes.rst
index 1622376..49d3aa1 100644
--- a/docs/changes.rst
+++ b/docs/changes.rst
@@ -4,6 +4,10 @@ Changelog
 `Unreleased`_ - TBD
 -------------------
 
+**Fixed**
+
+- Do not mutate the input ``moneyed.Money`` class to ``djmoney.money.Money`` in ``MoneyField.default`` and F-expressions. `#603`_ (`moser`_)
+
 `1.3`_ - 2021-01-10
 -------------------
 
@@ -700,6 +704,7 @@ wrapping with ``money_manager``.
 .. _0.3: https://github.com/django-money/django-money/compare/0.2...0.3
 .. _0.2: https://github.com/django-money/django-money/compare/0.2...a6d90348085332a393abb40b86b5dd9505489b04
 
+.. _#603: https://github.com/django-money/django-money/issues/603
 .. _#595: https://github.com/django-money/django-money/issues/595
 .. _#593: https://github.com/django-money/django-money/issues/593
 .. _#586: https://github.com/django-money/django-money/issues/586
@@ -852,6 +857,7 @@ wrapping with ``money_manager``.
 .. _lobziik: https://github.com/lobziik
 .. _mattions: https://github.com/mattions
 .. _mithrilstar: https://github.com/mithrilstar
+.. _moser: https://github.com/moser
 .. _MrFus10n: https://github.com/MrFus10n
 .. _msgre: https://github.com/msgre
 .. _mstarostik: https://github.com/mstarostik

diff --git a/tests/test_models.py b/tests/test_models.py
index d13ec03..3641356 100644
--- a/tests/test_models.py
+++ b/tests/test_models.py
@@ -83,6 +83,31 @@ class TestVanillaMoneyField:
         retrieved = model_class.objects.get(pk=instance.pk)
         assert retrieved.money == expected
 
+    def test_old_money_not_mutated_default(self):
+        # See GH-603
+        money = OldMoney(1, "EUR")
+
+        # When `moneyed.Money` is passed as a default value to a model
+        class Model(models.Model):
+            price = MoneyField(default=money, max_digits=10, decimal_places=2)
+
+            class Meta:
+                abstract = True
+
+        # Its class should remain the same
+        assert type(money) is OldMoney
+
+    def test_old_money_not_mutated_f_object(self):
+        # See GH-603
+        money = OldMoney(1, "EUR")
+
+        instance = ModelWithVanillaMoneyField.objects.create(money=Money(5, "EUR"), integer=2)
+        # When `moneyed.Money` is a part of an F-expression
+        instance.money = F("money") + money
+
+        # Its class should remain the same
+        assert type(money) is OldMoney
+
     def test_old_money_defaults(self):
         instance = ModelWithDefaultAsOldMoney.objects.create()
         assert instance.money == Money(".01", "RUB")

djmoney alters existing objects
We have an application that uses `moneyed` and (sub-classes of) its `Money` type in a non-Django environment. We recently started integrating this into a Django app that uses djmoney and started getting weird errors in seemingly unrelated cases  because instances of `djmoney.money.Money` started showing up there.

We tracked this down to a behavior of the djmoney package in `djmoney.models.fields`:
https://github.com/django-money/django-money/blob/bb222ed619f72a0112aef8c0fd9a4823b1e6e388/djmoney/models/fields.py#L38
https://github.com/django-money/django-money/blob/bb222ed619f72a0112aef8c0fd9a4823b1e6e388/djmoney/models/fields.py#L209

The two places alter **the type of an existing object**. Can we change this to copying the objects before altering them?
tests/test_models.py::TestVanillaMoneyField::test_old_money_not_mutated_default tests/test_models.py::TestVanillaMoneyField::test_old_money_not_mutated_f_object
tests/test_models.py::TestVanillaMoneyField::test_create_defaults[ModelWithVanillaMoneyField-kwargs0-expected0] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[ModelWithVanillaMoneyField-kwargs1-expected1] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[BaseModel-kwargs2-expected2] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[BaseModel-kwargs3-expected3] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[BaseModel-kwargs4-expected4] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[BaseModel-kwargs5-expected5] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[BaseModel-kwargs6-expected6] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[BaseModel-kwargs7-expected7] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[ModelWithDefaultAsMoney-kwargs8-expected8] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[ModelWithDefaultAsFloat-kwargs9-expected9] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[ModelWithDefaultAsStringWithCurrency-kwargs10-expected10] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[ModelWithDefaultAsString-kwargs11-expected11] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[ModelWithDefaultAsInt-kwargs12-expected12] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[ModelWithDefaultAsDecimal-kwargs13-expected13] tests/test_models.py::TestVanillaMoneyField::test_create_defaults[CryptoModel-kwargs14-expected14] tests/test_models.py::TestVanillaMoneyField::test_old_money_defaults tests/test_models.py::TestVanillaMoneyField::test_revert_to_default[ModelWithVanillaMoneyField-other_value0] tests/test_models.py::TestVanillaMoneyField::test_revert_to_default[BaseModel-other_value1] tests/test_models.py::TestVanillaMoneyField::test_revert_to_default[ModelWithDefaultAsMoney-other_value2] tests/test_models.py::TestVanillaMoneyField::test_revert_to_default[ModelWithDefaultAsFloat-other_value3] tests/test_models.py::TestVanillaMoneyField::test_revert_to_default[ModelWithDefaultAsFloat-other_value4] tests/test_models.py::TestVanillaMoneyField::test_invalid_values[value0] tests/test_models.py::TestVanillaMoneyField::test_invalid_values[value1] tests/test_models.py::TestVanillaMoneyField::test_invalid_values[value2] tests/test_models.py::TestVanillaMoneyField::test_save_new_value[money-Money0] tests/test_models.py::TestVanillaMoneyField::test_save_new_value[money-Money1] tests/test_models.py::TestVanillaMoneyField::test_save_new_value[second_money-Money0] tests/test_models.py::TestVanillaMoneyField::test_save_new_value[second_money-Money1] tests/test_models.py::TestVanillaMoneyField::test_rounding tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters0-1] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters1-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters2-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters3-0] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters4-3] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters5-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters6-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters7-3] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters8-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters9-1] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money0-filters10-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters0-1] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters1-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters2-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters3-0] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters4-3] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters5-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters6-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters7-3] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters8-2] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters9-1] tests/test_models.py::TestVanillaMoneyField::test_comparison_lookup[Money1-filters10-2] tests/test_models.py::TestVanillaMoneyField::test_date_lookup tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-startswith-2-1] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-regex-^[134]-3] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-iregex-^[134]-3] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-istartswith-2-1] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-contains-5-2] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-lt-5-4] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-endswith-5-2] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-iendswith-5-2] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-gte-4-3] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-iexact-3-1] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-exact-3-1] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-isnull-True-0] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-range-rhs12-4] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-lte-2-2] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-gt-3-3] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-icontains-5-2] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money0-in-rhs16-1] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-startswith-2-1] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-regex-^[134]-3] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-iregex-^[134]-3] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-istartswith-2-1] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-contains-5-2] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-lt-5-4] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-endswith-5-2] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-iendswith-5-2] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-gte-4-3] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-iexact-3-1] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-exact-3-1] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-isnull-True-0] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-range-rhs12-4] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-lte-2-2] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-gt-3-3] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-icontains-5-2] tests/test_models.py::TestVanillaMoneyField::test_all_lookups[Money1-in-rhs16-1] tests/test_models.py::TestVanillaMoneyField::test_exact_match tests/test_models.py::TestVanillaMoneyField::test_issue_300_regression tests/test_models.py::TestVanillaMoneyField::test_range_search tests/test_models.py::TestVanillaMoneyField::test_filter_chaining tests/test_models.py::TestVanillaMoneyField::test_currency_querying[ModelWithVanillaMoneyField] tests/test_models.py::TestVanillaMoneyField::test_currency_querying[ModelWithChoicesMoneyField] tests/test_models.py::TestVanillaMoneyField::test_in_lookup[Money0] tests/test_models.py::TestVanillaMoneyField::test_in_lookup[Money1] tests/test_models.py::TestVanillaMoneyField::test_in_lookup_f_expression[Money0] tests/test_models.py::TestVanillaMoneyField::test_in_lookup_f_expression[Money1] tests/test_models.py::TestVanillaMoneyField::test_isnull_lookup tests/test_models.py::TestVanillaMoneyField::test_null_default tests/test_models.py::TestGetOrCreate::test_get_or_create_respects_currency[ModelWithVanillaMoneyField-money-kwargs0-PLN] tests/test_models.py::TestGetOrCreate::test_get_or_create_respects_currency[ModelWithVanillaMoneyField-money-kwargs1-EUR] tests/test_models.py::TestGetOrCreate::test_get_or_create_respects_currency[ModelWithVanillaMoneyField-money-kwargs2-EUR] tests/test_models.py::TestGetOrCreate::test_get_or_create_respects_currency[ModelWithSharedCurrency-first-kwargs3-CZK] tests/test_models.py::TestGetOrCreate::test_get_or_create_respects_defaults tests/test_models.py::TestGetOrCreate::test_defaults tests/test_models.py::TestGetOrCreate::test_currency_field_lookup tests/test_models.py::TestGetOrCreate::test_no_default_model[NullMoneyFieldModel-create_kwargs0-get_kwargs0] tests/test_models.py::TestGetOrCreate::test_no_default_model[ModelWithSharedCurrency-create_kwargs1-get_kwargs1] tests/test_models.py::TestGetOrCreate::test_shared_currency tests/test_models.py::TestNullableCurrency::test_create_nullable tests/test_models.py::TestNullableCurrency::test_create_default tests/test_models.py::TestNullableCurrency::test_fails_with_null_currency tests/test_models.py::TestNullableCurrency::test_fails_with_nullable_but_no_default tests/test_models.py::TestNullableCurrency::test_query_not_null tests/test_models.py::TestNullableCurrency::test_query_null tests/test_models.py::TestFExpressions::test_save[f_obj0-expected0] tests/test_models.py::TestFExpressions::test_save[f_obj1-expected1] tests/test_models.py::TestFExpressions::test_save[f_obj2-expected2] tests/test_models.py::TestFExpressions::test_save[f_obj3-expected3] tests/test_models.py::TestFExpressions::test_save[f_obj4-expected4] tests/test_models.py::TestFExpressions::test_save[f_obj5-expected5] tests/test_models.py::TestFExpressions::test_save[f_obj6-expected6] tests/test_models.py::TestFExpressions::test_save[f_obj7-expected7] tests/test_models.py::TestFExpressions::test_save[f_obj8-expected8] tests/test_models.py::TestFExpressions::test_save[f_obj9-expected9] tests/test_models.py::TestFExpressions::test_save[f_obj10-expected10] tests/test_models.py::TestFExpressions::test_save[f_obj11-expected11] tests/test_models.py::TestFExpressions::test_save[f_obj12-expected12] tests/test_models.py::TestFExpressions::test_save[f_obj13-expected13] tests/test_models.py::TestFExpressions::test_save[f_obj14-expected14] tests/test_models.py::TestFExpressions::test_save[f_obj15-expected15] tests/test_models.py::TestFExpressions::test_f_update[f_obj0-expected0] tests/test_models.py::TestFExpressions::test_f_update[f_obj1-expected1] tests/test_models.py::TestFExpressions::test_f_update[f_obj2-expected2] tests/test_models.py::TestFExpressions::test_f_update[f_obj3-expected3] tests/test_models.py::TestFExpressions::test_f_update[f_obj4-expected4] tests/test_models.py::TestFExpressions::test_f_update[f_obj5-expected5] tests/test_models.py::TestFExpressions::test_f_update[f_obj6-expected6] tests/test_models.py::TestFExpressions::test_f_update[f_obj7-expected7] tests/test_models.py::TestFExpressions::test_f_update[f_obj8-expected8] tests/test_models.py::TestFExpressions::test_f_update[f_obj9-expected9] tests/test_models.py::TestFExpressions::test_f_update[f_obj10-expected10] tests/test_models.py::TestFExpressions::test_f_update[f_obj11-expected11] tests/test_models.py::TestFExpressions::test_f_update[f_obj12-expected12] tests/test_models.py::TestFExpressions::test_f_update[f_obj13-expected13] tests/test_models.py::TestFExpressions::test_f_update[f_obj14-expected14] tests/test_models.py::TestFExpressions::test_f_update[f_obj15-expected15] tests/test_models.py::TestFExpressions::test_default_update tests/test_models.py::TestFExpressions::test_filtration[create_kwargs0-filter_value0-True] tests/test_models.py::TestFExpressions::test_filtration[create_kwargs1-filter_value1-True] tests/test_models.py::TestFExpressions::test_filtration[create_kwargs2-filter_value2-False] tests/test_models.py::TestFExpressions::test_filtration[create_kwargs3-filter_value3-True] tests/test_models.py::TestFExpressions::test_filtration[create_kwargs4-filter_value4-True] tests/test_models.py::TestFExpressions::test_filtration[create_kwargs5-filter_value5-False] tests/test_models.py::TestFExpressions::test_filtration[create_kwargs6-filter_value6-False] tests/test_models.py::TestFExpressions::test_update_fields_save tests/test_models.py::TestFExpressions::test_invalid_expressions_access[f_obj0] tests/test_models.py::TestFExpressions::test_invalid_expressions_access[f_obj1] tests/test_models.py::TestFExpressions::test_invalid_expressions_access[f_obj2] tests/test_models.py::TestFExpressions::test_invalid_expressions_access[f_obj3] tests/test_models.py::TestFExpressions::test_invalid_expressions_access[f_obj4] tests/test_models.py::TestFExpressions::test_invalid_expressions_access[f_obj5] tests/test_models.py::TestFExpressions::test_invalid_expressions_access[f_obj6] tests/test_models.py::TestFExpressions::test_invalid_expressions_access[f_obj7] tests/test_models.py::TestFExpressions::test_invalid_expressions_access[f_obj8] tests/test_models.py::TestExpressions::test_bulk_update tests/test_models.py::TestExpressions::test_conditional_update tests/test_models.py::TestExpressions::test_create_func tests/test_models.py::TestExpressions::test_value_create[None-None] tests/test_models.py::TestExpressions::test_value_create[10-expected1] tests/test_models.py::TestExpressions::test_value_create[value2-expected2] tests/test_models.py::TestExpressions::test_value_create_invalid tests/test_models.py::TestExpressions::test_expressions_for_non_money_fields tests/test_models.py::test_find_models_related_to_money_models tests/test_models.py::test_allow_expression_nodes_without_money tests/test_models.py::test_base_model tests/test_models.py::TestInheritance::test_model[InheritedModel] tests/test_models.py::TestInheritance::test_model[InheritorModel] tests/test_models.py::TestInheritance::test_fields[InheritedModel] tests/test_models.py::TestInheritance::test_fields[InheritorModel] tests/test_models.py::TestManager::test_manager tests/test_models.py::TestManager::test_objects_creation tests/test_models.py::TestProxyModel::test_instances tests/test_models.py::TestProxyModel::test_patching tests/test_models.py::TestDifferentCurrencies::test_add_default tests/test_models.py::TestDifferentCurrencies::test_sub_default tests/test_models.py::TestDifferentCurrencies::test_eq tests/test_models.py::TestDifferentCurrencies::test_ne tests/test_models.py::TestDifferentCurrencies::test_ne_currency tests/test_models.py::test_manager_instance_access[ModelWithNonMoneyField] tests/test_models.py::test_manager_instance_access[InheritorModel] tests/test_models.py::test_manager_instance_access[InheritedModel] tests/test_models.py::test_manager_instance_access[ProxyModel] tests/test_models.py::test_different_hashes tests/test_models.py::test_migration_serialization tests/test_models.py::test_clear_meta_cache[ModelWithVanillaMoneyField-objects] tests/test_models.py::test_clear_meta_cache[ModelWithCustomDefaultManager-custom] tests/test_models.py::TestFieldAttributes::test_missing_attributes tests/test_models.py::TestFieldAttributes::test_default_currency tests/test_models.py::TestCustomManager::test_method tests/test_models.py::test_package_is_importable tests/test_models.py::test_hash_uniqueness tests/test_models.py::test_override_decorator tests/test_models.py::TestSharedCurrency::test_attributes tests/test_models.py::TestSharedCurrency::test_filter_by_money_match[args0-kwargs0] tests/test_models.py::TestSharedCurrency::test_filter_by_money_match[args1-kwargs1] tests/test_models.py::TestSharedCurrency::test_filter_by_money_no_match[args0-kwargs0] tests/test_models.py::TestSharedCurrency::test_filter_by_money_no_match[args1-kwargs1] tests/test_models.py::TestSharedCurrency::test_f_query[args0-kwargs0] tests/test_models.py::TestSharedCurrency::test_f_query[args1-kwargs1] tests/test_models.py::TestSharedCurrency::test_in_lookup[args0-kwargs0] tests/test_models.py::TestSharedCurrency::test_in_lookup[args1-kwargs1] tests/test_models.py::TestSharedCurrency::test_create_with_money tests/test_models.py::test_order_by tests/test_models.py::test_distinct_through_wrapper tests/test_models.py::test_mixer_blend