use boxy types to hide the polymorphism in Value and Diff