What is the difference between PAGEIOLATCH_* and IO_COMPLETION?
PAGEIOLATCH_* 

I am quoting from Paul Randal's blog post:


  SQL Server has two types of reads: logical I/Os and physical I/Os.
  When the Access Methods portion of the Storage Engine needs to access
  a page, it asks the Buffer Pool for a pointer to the page in memory
  (called a logical I/O) and the Buffer Pool checks through its metadata
  to see if that page is already in memory.
  
  If the page is in memory, the Buffer Pool gives the Access Methods the
  pointer, and the I/O remains a logical I/O. If the page is not in
  memory, the Buffer Pool issues a "real" I/O (called a physical I/O)
  and the thread has to wait for it to complete – incurring a
  PAGEIOLATCH_XX wait. Once the I/O completes and the pointer is
  available, the thread is notified and can continue running.


IO_COMPLETION

Again quoting from a webpage that belongs to sqlskills.com.

This wait type represents a variety of synchronous read and write operations in data files are not related to tables, plus reads from the transaction log.

What do non-data page IOs mean? 

Few examples from Paul Randal's article will make it clear what nod-data page means. 


Reading log blocks from the transaction log (during any operation that causes the log to be read from disk – e.g. recovery)
Reading allocation bitmaps from disk (e.g. GAM, SGAM, PFS pages) during many operations (e.g. recovery, DB startup, restore)
Writing intermediate sort buffers to disk (these are called ‘Bobs’)
Reading and writing merge results from/to disk during a merge join
Reading and writing eager spools to disk
Reading VLF headers from the transaction log