Magento: Show address fields in account creation form
The Magento eCommerce platform hides the "address fields", including the customer's company name, by default. To enable them, most sources on the internet suggest overriding the register.phtml file and either commenting out the check to getShowAddressFields or to specifically call setShowAddressFields (true);. That'll work, but it's not the proper way to do it. Read on the learn the proper way.

The default Magento account creation form does not allow the customer to enter his address information.
TL;DR
First, the quick answer. To enable the address fields, add the following to your app/design/frontend/default/*template*/layout/local.xml file:
<reference name="customer_form_register"
Explanation
Magento allows virtually all of its behaviour to be overridden by replacing modules or templates. Making a copy of a template (or worse: editing the ones included in the base package) is overkill for this case and will result in your custom template not being updated or the your changes being overwritten when Magento is updated.
For this reason, even though a simple call to setShowAddressFields (true) would suffice, that should not be done through the template file. Instead, Magento provides a way to do such method calls through its local XML files. That is what happens in the XML snippet above.
Sidebar: where is that method?
The customer registration form block is of type Mage\_Customer\_Block\_Form\_Register, which (through Mage\_Directory\_Block\_Data, Mage\_Core\_Block\_Template, Mage\_Core\_Block\_Abstract) eventually inherits from Varien\_Object. In none of those classes will you actually find the getShowAddressFields or setShowAddressField methods defined as functions and method\_exists ($this, 'getShowAddressField') will actually return false. How can this work?
This is because Varien\_Object makes use of the PHP feature "Method overloading". By having a function \_\_call ($method, $args) method, it can intercept any calls to non-existent methods. This implementation then checks the name of the method being called and converts the name "getShowAddressFields" into the key "show_address_fields" and looks up this value in its internal data dictionary. If the method name starts with "set", rather than "get" it stores the value instead. It also handles "has" (to see whether a property exists) and "uns" (to unset a property).
It's an intriguing, clean and pretty way to avoid having to write setters and getters for every little variable, but if you're not aware of it, it can lead to a lot of searching where these mystery methods are as grep won't find anything. An alternative method would be to use property overloading instead. The reason to use the set/get functions is probably to make it easier to override getters/setters for certain properties where they may have side effects and for compliance with coding quidelines.