A few random musings.
* It slightly odd that the I²C buses and Analogue ports are numbered from 0, but the digital ports are numbered from 1.
* I hope the power pin-outs on each port are the same, across the port types, so that if you connect a device to the wrong type of port, it doesn't work, but isn't damaged.
* I²C is a bus system, each device has (from memory) a 8 bit address, which is 5 bit class and 3 bit device. Therefore there can be 4 digital ports, with 8 bit output each. Thus, if the LEDs had HEX dip selectors on them, there could be upto 32 LEDs.
* The I²C ports should allow daisy-chaining, or star-topology, subject to power constraints.
All-in-all an useful interesting module. As for it not teaching people how to access a device, why run before you can walk? Adding a UART directly to the data/address bus is the classic way to do it, but is easy to destroy both the CPU, the UART, and anything else on the buses if things go wrong. Anyway, don't modern peripherals for embedded systems come with a SDK, or at least sample code, rather than just a data sheet?