In the end this type of decision comes down to preference (obviously), but it is also a reminder that every architectural decision needs to be traceable to a certain purpose. Those purposes or requirements can have a multitude of backgrounds, ranging from business to technical, but the important point is that they should be there, for the simple reason that whenever you find yourself questioning specific details (decisions) in the architecture at hand, you can trace the motivation behind the decisions.
In doing architectural reviews, I often find a 3-tier UI/BLL/DAL architecture as you described, and very often for no other reason than "everybody else is doing it", "it is the Microsoft way", et cetera ad nauseam. It is a fine architecture (or layer pattern), but it is not the one-size-fits-all (since that doesn't appear to exist in IT anywhere).
A few questions that come to mind: where do the custom objects live that "abstract the DB tables" (quote), and to what level do you expose these? Are these DTOs, or objects from the BLL that are populated by the DAL? Does the UI know these objects (direct reference), or are they hidden by the BLL? Are objects in the BLL persistence-aware? What do your references between tiers look like? Drawing a high-level picture can help here.
Some reasons not to do what you propose have already been posted; while these are all valid, each objection can potentially be mitigated by a workaround (or 10). Given a greenfield situation, I actually prefer doing something along these lines, making the data access as (architecturally) lean as possible. I find that this keeps the solution agile and well suited to change when requirements shift (as they always do).
A few suggestions: if you are going to go forward with this, try to explicitly separate reads from writes (queries from commands, questions from transactions, choose your lingo). An alternative to linking the UI to the DAL would be to create a very thing Service layer (how's that for an ambiguous term? Actually, this is why I sometimes name this the "Operations" layer, for no other reason than to disambiguate) that can either grab the required objects directly from your data access layer, or invoke the business layer whenever the operation requires it. This way, you still define all your interaction between the UI and the underlying infrastructure in one way, but you can optimize each operation individually.