What a system "needs" to boot is executable code at a specific memory address.
If you put the kernel at the right spot it will boot (and that's how we did it in the old days—without boot loaders). These days we put a boot loader there. A boot loader is just executable code that's a little smarter than the hardware (but not by much) about where to find other executable code.
To explain it in very simple terms, at power on the hardware will begin execution of a program in the firmware. This varies by hardware, but on PC's it used to be BIOS. Today it might be EFI. That program, whatever it is knows how to look on the block device(s) at specific addresses. The block(s) found there get loaded into RAM and then executed. The hardware is very unintelligent about what that might be, so there really isn't any requirement that it be a particular thing, except that it is proper machine code for the processor*.
In your case, the only thing required to boot is uImage (the Kernel image). U-Boot is simply a way to find uImage. MLO is presumably just a way to find U-Boot. In theory, if you placed uImage in the right blocks it would boot directly.
* Incidentally, bricking is when whatever happens to be in those blocks is not properly executable by the processor.