Several addresses are actually on 32 bits, such as in

typedef struct {
   u32 flags;
   u32 mem_lower;
   u32 mem_upper;
   u32 boot_device;
   u32 cmdline;
   u32 mods_count;
   u32 mods_addr;
   union {
       aout_symbol_table_t aout_sym;
       elf_section_header_table_t elf_sec;
   } u;
   u32 mmap_length;
   u32 mmap_addr;
} multiboot_info_t


However, on x86_64 using gcc, addresses as well as unsigned long are 64 bits long.

It seems that luckily mmap_addr is below 2*32-1, making the u32 type acceptable
so far (for instance in function __start_xen, where the memory map is turned into
another structure) but what would it cost to change it into u64 ?
After all, the multiboot specification (page 18) has 'unsigned long' instead of u32 here.