The best explanation for this I have got was cflemings one on IRC:

(11:42:55) cfleming: sveri zilti: One major difference is that core.typed validates your code, schema validates your data. If you’re dealing with data exclusively created and manipulated by your code, core.typed is a good solution. If you’re validating data from an external source, you need schema.

(11:43:57) cfleming: sveri zilti: core.typed can validate that your functions only ever create data of a particular shape, but cannot validate that arbitrary data complies to that shape.

I just write it down here to have a place where I can look again in some months.