Index: Modules/datetimemodule.c =================================================================== --- Modules/datetimemodule.c (revision 61343) +++ Modules/datetimemodule.c (working copy) @@ -2343,7 +2343,7 @@ int day = GET_DAY(date) + (negate ? -deltadays : deltadays); if (normalize_date(&year, &month, &day) >= 0) - result = new_date(year, month, day); + result = new_date_ex(year, month, day, Py_TYPE(date)); return result; } @@ -3986,9 +3986,10 @@ &hour, &minute, &second, µsecond) < 0) return NULL; else - return new_datetime(year, month, day, - hour, minute, second, microsecond, - HASTZINFO(date) ? date->tzinfo : Py_None); + return new_datetime_ex(year, month, day, + hour, minute, second, microsecond, + HASTZINFO(date) ? date->tzinfo : Py_None, + Py_TYPE(date)); } static PyObject * Index: Lib/test/test_datetime.py =================================================================== --- Lib/test/test_datetime.py (revision 61343) +++ Lib/test/test_datetime.py (working copy) @@ -3323,6 +3323,14 @@ self.assertEqual(as_datetime, datetime_sc) self.assertEqual(datetime_sc, as_datetime) + def test_issue2267(self): + class Date(date): + pass + class Datetime(datetime): + pass + self.assertTrue(type(Date(2008,3,10) + timedelta(1)) is Date) + self.assertTrue(type(Datetime(2008,3,10,12) + timedelta(1)) is Datetime) + def test_main(): test_support.run_unittest(__name__)