5.8 brought Carbon 2, and the change that matters is not the API surface — it is that CarbonImmutable exists and the mutable class is still the default everywhere.
$start = Carbon::parse('2019-03-01');
$end = $start->addMonth(); // MUTATES $start. both are April.
$start = CarbonImmutable::parse('2019-03-01');
$end = $start->addMonth(); // $start is still March
// and the cast, which is where to make the decision
protected $casts = ['placed_at' => 'immutable_datetime'];
The mutable default is a decade-old design decision that produces a specific and recurring bug: a date passed into a method comes back changed, and the caller’s subsequent arithmetic is wrong. The immutable cast on Eloquent models is the cheapest place to fix it wholesale, and it is worth doing on new models immediately rather than as a migration. Mixing the two types in one codebase is tolerable; mixing them in one calculation is not.