I forgot to say that when you create summary boxes, you must be extremely careful not to introduce evaluation leaks. Here's a naive way to do it, which will then cause problems:
ClearAll[date]
date /: MakeBoxes[expr : date[{y_, m_, d_}], form : StandardForm | TraditionalForm] :=
With[{boxes =
ToBoxes[Panel@Grid[{{"year:", y}, {"month:", m}, {"day:", d}}], form]},
InterpretationBox[boxes, expr]
]

All good so far.
Now let's make a function that creates a date
:
make2017Date[{m_, d_}] := date[{2017, m, d}]
And see its definition:

Still looking good. But now define:
m = 12;

Oops! Evaluation leak!
Something much worse could happen too. What if m
contains code, like m := Print["Boo!"]
?
The simple way to fix it is to put checks on your values:
date /: MakeBoxes[expr : date[{y_Integer, m_Integer, d_Integer}], ...] := ...